From 28322a5513b95d0f34d1ae9fb6a748d1f036f654 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Fri, 22 Aug 2014 15:44:23 +0200 Subject: [PATCH 01/97] Pydev updated to the latest dev version. --- python/helpers/pydev/README.md | 7 + python/helpers/pydev/__init__.py | 0 python/helpers/pydev/_pydev_BaseHTTPServer.py | 604 --- python/helpers/pydev/_pydev_Queue.py | 244 -- .../pydev/_pydev_SimpleXMLRPCServer.py | 610 --- python/helpers/pydev/_pydev_SocketServer.py | 715 ---- .../helpers/pydev/_pydev_imps/_pydev_Queue.py | 3 +- .../pydev/_pydev_imps/_pydev_select.py | 10 +- .../pydev/_pydev_imps/_pydev_socket.py | 10 +- .../pydev/_pydev_imps/_pydev_thread.py | 8 + .../helpers/pydev/_pydev_imps/_pydev_time.py | 8 + python/helpers/pydev/_pydev_inspect.py | 788 ---- python/helpers/pydev/_pydev_select.py | 1 - python/helpers/pydev/_pydev_socket.py | 1 - python/helpers/pydev/_pydev_threading.py | 985 +---- python/helpers/pydev/_pydev_time.py | 1 - python/helpers/pydev/_pydev_xmlrpclib.py | 1493 ------- python/helpers/pydev/fix_getpass.py | 19 +- python/helpers/pydev/merge_pydev_pycharm.txt | 20 +- python/helpers/pydev/pycompletionserver.py | 43 +- python/helpers/pydev/pydev_console_utils.py | 6 +- python/helpers/pydev/pydev_imports.py | 4 +- .../pydev/pydev_ipython/inputhookqt4.py | 6 +- python/helpers/pydev/pydev_ipython_console.py | 4 +- .../pydev/pydev_ipython_console_011.py | 46 +- python/helpers/pydev/pydev_localhost.py | 1 - python/helpers/pydev/pydev_monkey.py | 44 +- python/helpers/pydev/pydev_monkey_qt.py | 89 + .../helpers/pydev/pydev_runfiles_parallel.py | 9 +- .../helpers/pydev/pydev_runfiles_xml_rpc.py | 1 + python/helpers/pydev/pydevconsole.py | 18 +- python/helpers/pydev/pydevd.py | 162 +- .../pydev/pydevd_additional_thread_info.py | 7 +- python/helpers/pydev/pydevd_breakpoints.py | 5 +- python/helpers/pydev/pydevd_comm.py | 75 +- python/helpers/pydev/pydevd_constants.py | 8 +- python/helpers/pydev/pydevd_custom_frames.py | 3 +- python/helpers/pydev/pydevd_frame.py | 6 +- python/helpers/pydev/pydevd_resolver.py | 49 +- python/helpers/pydev/pydevd_signature.py | 9 +- python/helpers/pydev/pydevd_tracing.py | 7 +- python/helpers/pydev/pydevd_vars.py | 8 +- python/helpers/pydev/requirements.txt | 4 + python/helpers/pydev/runfiles.py | 7 +- ...vconsole.py => test_check_pydevconsole.py} | 66 +- .../helpers/pydev/tests/test_get_referrers.py | 14 - python/helpers/pydev/tests/test_jyserver.py | 8 + .../pydev/tests/test_jysimpleTipper.py | 39 +- .../pydev/tests/test_pydev_ipython_010.py | 80 - .../pydev/tests/test_pydev_ipython_011.py | 217 +- .../helpers/pydev/tests/test_pydevconsole.py | 283 +- python/helpers/pydev/tests/test_pyserver.py | 22 +- .../helpers/pydev/tests/test_simpleTipper.py | 38 +- .../helpers/pydev/tests_mainloop/gui-glut.py | 78 +- .../helpers/pydev/tests_mainloop/gui-gtk.py | 49 +- .../helpers/pydev/tests_mainloop/gui-gtk3.py | 45 +- .../pydev/tests_mainloop/gui-pyglet.py | 35 +- python/helpers/pydev/tests_mainloop/gui-qt.py | 44 +- python/helpers/pydev/tests_mainloop/gui-tk.py | 44 +- python/helpers/pydev/tests_mainloop/gui-wx.py | 174 +- .../pydev/tests_python/_debugger_case18.py | 2 +- .../pydev/tests_python/_debugger_case19.py | 2 +- .../pydev/tests_python/_debugger_case7.py | 2 +- .../pydev/tests_python/_debugger_case89.py | 12 +- .../tests_python/_debugger_case_qthread1.py | 25 + .../tests_python/_debugger_case_qthread2.py | 31 + .../tests_python/_debugger_case_qthread3.py | 28 + .../test_additional_thread_info.py | 26 +- .../pydev/tests_python/test_debugger.py | 502 ++- .../pydev/tests_python/test_pydev_monkey.py | 21 +- .../pydev/tests_python/test_save_locals.py | 6 +- .../pydev/tests_runfiles/samples/__init__.py | 0 .../samples/nested_dir/.cvsignore | 2 + .../samples/nested_dir/nested2/.cvsignore | 2 + .../samples/nested_dir/nested3/.cvsignore | 2 + .../samples/not_in_default_pythonpath.txt | 1 + .../pydev/tests_runfiles/test_runfiles.py | 64 +- python/helpers/pydev/third_party/__init__.py | 1 + .../pydev/third_party/pep8/autopep8.py | 3687 +++++++++++++++++ .../pep8/lib2to3/lib2to3/.gitignore | 1 + .../pep8/lib2to3/lib2to3/Grammar.txt | 158 + .../pep8/lib2to3/lib2to3/PatternGrammar.txt | 28 + .../pep8/lib2to3/lib2to3/__init__.py | 1 + .../pep8/lib2to3/lib2to3/__main__.py | 4 + .../pep8/lib2to3/lib2to3/btm_matcher.py | 168 + .../pep8/lib2to3/lib2to3/btm_utils.py | 283 ++ .../pep8/lib2to3/lib2to3/fixer_base.py | 189 + .../pep8/lib2to3/lib2to3/fixer_util.py | 430 ++ .../pep8/lib2to3/lib2to3/fixes/__init__.py | 1 + .../pep8/lib2to3/lib2to3/fixes/fix_apply.py | 59 + .../lib2to3/lib2to3/fixes/fix_basestring.py | 14 + .../pep8/lib2to3/lib2to3/fixes/fix_buffer.py | 22 + .../lib2to3/lib2to3/fixes/fix_callable.py | 37 + .../pep8/lib2to3/lib2to3/fixes/fix_dict.py | 106 + .../pep8/lib2to3/lib2to3/fixes/fix_except.py | 93 + .../pep8/lib2to3/lib2to3/fixes/fix_exec.py | 39 + .../lib2to3/lib2to3/fixes/fix_execfile.py | 52 + .../lib2to3/lib2to3/fixes/fix_exitfunc.py | 72 + .../pep8/lib2to3/lib2to3/fixes/fix_filter.py | 75 + .../lib2to3/lib2to3/fixes/fix_funcattrs.py | 21 + .../pep8/lib2to3/lib2to3/fixes/fix_future.py | 22 + .../pep8/lib2to3/lib2to3/fixes/fix_getcwdu.py | 19 + .../pep8/lib2to3/lib2to3/fixes/fix_has_key.py | 109 + .../pep8/lib2to3/lib2to3/fixes/fix_idioms.py | 152 + .../pep8/lib2to3/lib2to3/fixes/fix_import.py | 99 + .../pep8/lib2to3/lib2to3/fixes/fix_imports.py | 145 + .../lib2to3/lib2to3/fixes/fix_imports2.py | 16 + .../pep8/lib2to3/lib2to3/fixes/fix_input.py | 26 + .../pep8/lib2to3/lib2to3/fixes/fix_intern.py | 46 + .../lib2to3/lib2to3/fixes/fix_isinstance.py | 52 + .../lib2to3/lib2to3/fixes/fix_itertools.py | 43 + .../lib2to3/fixes/fix_itertools_imports.py | 57 + .../pep8/lib2to3/lib2to3/fixes/fix_long.py | 19 + .../pep8/lib2to3/lib2to3/fixes/fix_map.py | 91 + .../lib2to3/lib2to3/fixes/fix_metaclass.py | 228 + .../lib2to3/lib2to3/fixes/fix_methodattrs.py | 24 + .../pep8/lib2to3/lib2to3/fixes/fix_ne.py | 23 + .../pep8/lib2to3/lib2to3/fixes/fix_next.py | 103 + .../pep8/lib2to3/lib2to3/fixes/fix_nonzero.py | 21 + .../lib2to3/lib2to3/fixes/fix_numliterals.py | 28 + .../lib2to3/lib2to3/fixes/fix_operator.py | 96 + .../pep8/lib2to3/lib2to3/fixes/fix_paren.py | 44 + .../pep8/lib2to3/lib2to3/fixes/fix_print.py | 87 + .../pep8/lib2to3/lib2to3/fixes/fix_raise.py | 90 + .../lib2to3/lib2to3/fixes/fix_raw_input.py | 17 + .../pep8/lib2to3/lib2to3/fixes/fix_reduce.py | 35 + .../pep8/lib2to3/lib2to3/fixes/fix_renames.py | 70 + .../pep8/lib2to3/lib2to3/fixes/fix_repr.py | 23 + .../lib2to3/lib2to3/fixes/fix_set_literal.py | 53 + .../lib2to3/fixes/fix_standarderror.py | 18 + .../pep8/lib2to3/lib2to3/fixes/fix_sys_exc.py | 30 + .../pep8/lib2to3/lib2to3/fixes/fix_throw.py | 56 + .../lib2to3/lib2to3/fixes/fix_tuple_params.py | 175 + .../pep8/lib2to3/lib2to3/fixes/fix_types.py | 61 + .../pep8/lib2to3/lib2to3/fixes/fix_unicode.py | 42 + .../pep8/lib2to3/lib2to3/fixes/fix_urllib.py | 196 + .../lib2to3/lib2to3/fixes/fix_ws_comma.py | 39 + .../pep8/lib2to3/lib2to3/fixes/fix_xrange.py | 73 + .../lib2to3/lib2to3/fixes/fix_xreadlines.py | 25 + .../pep8/lib2to3/lib2to3/fixes/fix_zip.py | 35 + .../third_party/pep8/lib2to3/lib2to3/main.py | 269 ++ .../pep8/lib2to3/lib2to3/patcomp.py | 205 + .../pep8/lib2to3/lib2to3/pgen2/__init__.py | 4 + .../pep8/lib2to3/lib2to3/pgen2/conv.py | 257 ++ .../pep8/lib2to3/lib2to3/pgen2/driver.py | 157 + .../pep8/lib2to3/lib2to3/pgen2/grammar.py | 184 + .../pep8/lib2to3/lib2to3/pgen2/literals.py | 60 + .../pep8/lib2to3/lib2to3/pgen2/parse.py | 201 + .../pep8/lib2to3/lib2to3/pgen2/pgen.py | 386 ++ .../pep8/lib2to3/lib2to3/pgen2/token.py | 82 + .../pep8/lib2to3/lib2to3/pgen2/tokenize.py | 500 +++ .../pep8/lib2to3/lib2to3/pygram.py | 38 + .../pep8/lib2to3/lib2to3/pytree.py | 887 ++++ .../pep8/lib2to3/lib2to3/refactor.py | 746 ++++ python/helpers/pydev/third_party/pep8/pep8.py | 1959 +++++++++ .../wrapped_for_pydev/ctypes/__init__.py | 514 +++ .../wrapped_for_pydev/ctypes/_ctypes.dll | Bin 0 -> 287417 bytes .../wrapped_for_pydev/ctypes/_endian.py | 58 + .../ctypes/ctypes-README.txt | 134 + .../ctypes/macholib/.cvsignore | 1 + .../ctypes/macholib/__init__.py | 9 + .../wrapped_for_pydev/ctypes/macholib/dyld.py | 167 + .../ctypes/macholib/dylib.py | 63 + .../ctypes/macholib/framework.py | 65 + .../wrapped_for_pydev/ctypes/util.py | 124 + .../wrapped_for_pydev/ctypes/wintypes.py | 98 + .../not_in_default_pythonpath.txt | 1 + 167 files changed, 16953 insertions(+), 6457 deletions(-) delete mode 100644 python/helpers/pydev/__init__.py delete mode 100644 python/helpers/pydev/_pydev_BaseHTTPServer.py delete mode 100644 python/helpers/pydev/_pydev_Queue.py delete mode 100644 python/helpers/pydev/_pydev_SimpleXMLRPCServer.py delete mode 100644 python/helpers/pydev/_pydev_SocketServer.py delete mode 100644 python/helpers/pydev/_pydev_inspect.py delete mode 100644 python/helpers/pydev/_pydev_select.py delete mode 100644 python/helpers/pydev/_pydev_socket.py delete mode 100644 python/helpers/pydev/_pydev_time.py delete mode 100644 python/helpers/pydev/_pydev_xmlrpclib.py create mode 100644 python/helpers/pydev/pydev_monkey_qt.py create mode 100644 python/helpers/pydev/requirements.txt rename python/helpers/pydev/tests/{check_pydevconsole.py => test_check_pydevconsole.py} (59%) delete mode 100644 python/helpers/pydev/tests/test_pydev_ipython_010.py create mode 100644 python/helpers/pydev/tests_python/_debugger_case_qthread1.py create mode 100644 python/helpers/pydev/tests_python/_debugger_case_qthread2.py create mode 100644 python/helpers/pydev/tests_python/_debugger_case_qthread3.py delete mode 100644 python/helpers/pydev/tests_runfiles/samples/__init__.py create mode 100644 python/helpers/pydev/tests_runfiles/samples/nested_dir/.cvsignore create mode 100644 python/helpers/pydev/tests_runfiles/samples/nested_dir/nested2/.cvsignore create mode 100644 python/helpers/pydev/tests_runfiles/samples/nested_dir/nested3/.cvsignore create mode 100644 python/helpers/pydev/tests_runfiles/samples/not_in_default_pythonpath.txt create mode 100644 python/helpers/pydev/third_party/__init__.py create mode 100644 python/helpers/pydev/third_party/pep8/autopep8.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/.gitignore create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/Grammar.txt create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/PatternGrammar.txt create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/__init__.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/__main__.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/btm_matcher.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/btm_utils.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixer_base.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixer_util.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/__init__.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_apply.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_basestring.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_buffer.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_callable.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_dict.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_except.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_exec.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_execfile.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_exitfunc.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_filter.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_funcattrs.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_future.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_getcwdu.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_has_key.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_idioms.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_import.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_imports.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_imports2.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_input.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_intern.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_isinstance.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_itertools.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_itertools_imports.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_long.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_map.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_metaclass.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_methodattrs.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_ne.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_next.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_nonzero.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_numliterals.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_operator.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_paren.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_print.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_raise.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_raw_input.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_reduce.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_renames.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_repr.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_set_literal.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_standarderror.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_sys_exc.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_throw.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_tuple_params.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_types.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_unicode.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_urllib.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_ws_comma.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_xrange.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_xreadlines.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_zip.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/main.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/patcomp.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/__init__.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/conv.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/driver.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/grammar.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/literals.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/parse.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/pgen.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/token.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/tokenize.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pygram.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pytree.py create mode 100644 python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/refactor.py create mode 100644 python/helpers/pydev/third_party/pep8/pep8.py create mode 100644 python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/__init__.py create mode 100644 python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/_ctypes.dll create mode 100644 python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/_endian.py create mode 100644 python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/ctypes-README.txt create mode 100644 python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/.cvsignore create mode 100644 python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/__init__.py create mode 100644 python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/dyld.py create mode 100644 python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/dylib.py create mode 100644 python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/framework.py create mode 100644 python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/util.py create mode 100644 python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/wintypes.py create mode 100644 python/helpers/pydev/third_party/wrapped_for_pydev/not_in_default_pythonpath.txt diff --git a/python/helpers/pydev/README.md b/python/helpers/pydev/README.md index 7b221164e66f..17df01ca8113 100644 --- a/python/helpers/pydev/README.md +++ b/python/helpers/pydev/README.md @@ -1,2 +1,9 @@ PyDev.Debugger ============== + +[![Build Status](https://travis-ci.org/fabioz/PyDev.Debugger.png)](https://travis-ci.org/fabioz/PyDev.Debugger) + +This repository contains the sources for the Debugger used in PyDev & PyCharm. + +It should be compatible with Python 2.4 onwards (as well as Jython 2.2.1, IronPython and PyPy -- and any +other variant which properly supports the Python structure for debuggers -- i.e.: sys.settrace/threading.settrace). \ No newline at end of file diff --git a/python/helpers/pydev/__init__.py b/python/helpers/pydev/__init__.py deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/python/helpers/pydev/_pydev_BaseHTTPServer.py b/python/helpers/pydev/_pydev_BaseHTTPServer.py deleted file mode 100644 index 1dcef2eeb67d..000000000000 --- a/python/helpers/pydev/_pydev_BaseHTTPServer.py +++ /dev/null @@ -1,604 +0,0 @@ -"""HTTP server base class. - -Note: the class in this module doesn't implement any HTTP request; see -SimpleHTTPServer for simple implementations of GET, HEAD and POST -(including CGI scripts). It does, however, optionally implement HTTP/1.1 -persistent connections, as of version 0.3. - -Contents: - -- BaseHTTPRequestHandler: HTTP request handler base class -- test: test function - -XXX To do: - -- log requests even later (to capture byte count) -- log user-agent header and other interesting goodies -- send error log to separate file -""" - - -# See also: -# -# HTTP Working Group T. Berners-Lee -# INTERNET-DRAFT R. T. Fielding -# H. Frystyk Nielsen -# Expires September 8, 1995 March 8, 1995 -# -# URL: http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-v10-spec-00.txt -# -# and -# -# Network Working Group R. Fielding -# Request for Comments: 2616 et al -# Obsoletes: 2068 June 1999 -# Category: Standards Track -# -# URL: http://www.faqs.org/rfcs/rfc2616.html - -# Log files -# --------- -# -# Here's a quote from the NCSA httpd docs about log file format. -# -# | The logfile format is as follows. Each line consists of: -# | -# | host rfc931 authuser [DD/Mon/YYYY:hh:mm:ss] "request" ddd bbbb -# | -# | host: Either the DNS name or the IP number of the remote client -# | rfc931: Any information returned by identd for this person, -# | - otherwise. -# | authuser: If user sent a userid for authentication, the user name, -# | - otherwise. -# | DD: Day -# | Mon: Month (calendar name) -# | YYYY: Year -# | hh: hour (24-hour format, the machine's timezone) -# | mm: minutes -# | ss: seconds -# | request: The first line of the HTTP request as sent by the client. -# | ddd: the status code returned by the server, - if not available. -# | bbbb: the total number of bytes sent, -# | *not including the HTTP/1.0 header*, - if not available -# | -# | You can determine the name of the file accessed through request. -# -# (Actually, the latter is only true if you know the server configuration -# at the time the request was made!) - -__version__ = "0.3" - -__all__ = ["HTTPServer", "BaseHTTPRequestHandler"] - -import sys -import _pydev_time as time -import _pydev_socket as socket # For gethostbyaddr() -from warnings import filterwarnings, catch_warnings -with catch_warnings(): - if sys.py3kwarning: - filterwarnings("ignore", ".*mimetools has been removed", - DeprecationWarning) - import mimetools - -import _pydev_SocketServer as SocketServer - -# Default error message template -DEFAULT_ERROR_MESSAGE = """\ - -Error response - - -

Error response

-

Error code %(code)d. -

Message: %(message)s. -

Error code explanation: %(code)s = %(explain)s. - -""" - -DEFAULT_ERROR_CONTENT_TYPE = "text/html" - -def _quote_html(html): - return html.replace("&", "&").replace("<", "<").replace(">", ">") - -class HTTPServer(SocketServer.TCPServer): - - allow_reuse_address = 1 # Seems to make sense in testing environment - - def server_bind(self): - """Override server_bind to store the server name.""" - SocketServer.TCPServer.server_bind(self) - host, port = self.socket.getsockname()[:2] - self.server_name = socket.getfqdn(host) - self.server_port = port - - -class BaseHTTPRequestHandler(SocketServer.StreamRequestHandler): - - """HTTP request handler base class. - - The following explanation of HTTP serves to guide you through the - code as well as to expose any misunderstandings I may have about - HTTP (so you don't need to read the code to figure out I'm wrong - :-). - - HTTP (HyperText Transfer Protocol) is an extensible protocol on - top of a reliable stream transport (e.g. TCP/IP). The protocol - recognizes three parts to a request: - - 1. One line identifying the request type and path - 2. An optional set of RFC-822-style headers - 3. An optional data part - - The headers and data are separated by a blank line. - - The first line of the request has the form - - - - where is a (case-sensitive) keyword such as GET or POST, - is a string containing path information for the request, - and should be the string "HTTP/1.0" or "HTTP/1.1". - is encoded using the URL encoding scheme (using %xx to signify - the ASCII character with hex code xx). - - The specification specifies that lines are separated by CRLF but - for compatibility with the widest range of clients recommends - servers also handle LF. Similarly, whitespace in the request line - is treated sensibly (allowing multiple spaces between components - and allowing trailing whitespace). - - Similarly, for output, lines ought to be separated by CRLF pairs - but most clients grok LF characters just fine. - - If the first line of the request has the form - - - - (i.e. is left out) then this is assumed to be an HTTP - 0.9 request; this form has no optional headers and data part and - the reply consists of just the data. - - The reply form of the HTTP 1.x protocol again has three parts: - - 1. One line giving the response code - 2. An optional set of RFC-822-style headers - 3. The data - - Again, the headers and data are separated by a blank line. - - The response code line has the form - - - - where is the protocol version ("HTTP/1.0" or "HTTP/1.1"), - is a 3-digit response code indicating success or - failure of the request, and is an optional - human-readable string explaining what the response code means. - - This server parses the request and the headers, and then calls a - function specific to the request type (). Specifically, - a request SPAM will be handled by a method do_SPAM(). If no - such method exists the server sends an error response to the - client. If it exists, it is called with no arguments: - - do_SPAM() - - Note that the request name is case sensitive (i.e. SPAM and spam - are different requests). - - The various request details are stored in instance variables: - - - client_address is the client IP address in the form (host, - port); - - - command, path and version are the broken-down request line; - - - headers is an instance of mimetools.Message (or a derived - class) containing the header information; - - - rfile is a file object open for reading positioned at the - start of the optional input data part; - - - wfile is a file object open for writing. - - IT IS IMPORTANT TO ADHERE TO THE PROTOCOL FOR WRITING! - - The first thing to be written must be the response line. Then - follow 0 or more header lines, then a blank line, and then the - actual data (if any). The meaning of the header lines depends on - the command executed by the server; in most cases, when data is - returned, there should be at least one header line of the form - - Content-type: / - - where and should be registered MIME types, - e.g. "text/html" or "text/plain". - - """ - - # The Python system version, truncated to its first component. - sys_version = "Python/" + sys.version.split()[0] - - # The server software version. You may want to override this. - # The format is multiple whitespace-separated strings, - # where each string is of the form name[/version]. - server_version = "BaseHTTP/" + __version__ - - # The default request version. This only affects responses up until - # the point where the request line is parsed, so it mainly decides what - # the client gets back when sending a malformed request line. - # Most web servers default to HTTP 0.9, i.e. don't send a status line. - default_request_version = "HTTP/0.9" - - def parse_request(self): - """Parse a request (internal). - - The request should be stored in self.raw_requestline; the results - are in self.command, self.path, self.request_version and - self.headers. - - Return True for success, False for failure; on failure, an - error is sent back. - - """ - self.command = None # set in case of error on the first line - self.request_version = version = self.default_request_version - self.close_connection = 1 - requestline = self.raw_requestline - requestline = requestline.rstrip('\r\n') - self.requestline = requestline - words = requestline.split() - if len(words) == 3: - command, path, version = words - if version[:5] != 'HTTP/': - self.send_error(400, "Bad request version (%r)" % version) - return False - try: - base_version_number = version.split('/', 1)[1] - version_number = base_version_number.split(".") - # RFC 2145 section 3.1 says there can be only one "." and - # - major and minor numbers MUST be treated as - # separate integers; - # - HTTP/2.4 is a lower version than HTTP/2.13, which in - # turn is lower than HTTP/12.3; - # - Leading zeros MUST be ignored by recipients. - if len(version_number) != 2: - raise ValueError - version_number = int(version_number[0]), int(version_number[1]) - except (ValueError, IndexError): - self.send_error(400, "Bad request version (%r)" % version) - return False - if version_number >= (1, 1) and self.protocol_version >= "HTTP/1.1": - self.close_connection = 0 - if version_number >= (2, 0): - self.send_error(505, - "Invalid HTTP Version (%s)" % base_version_number) - return False - elif len(words) == 2: - command, path = words - self.close_connection = 1 - if command != 'GET': - self.send_error(400, - "Bad HTTP/0.9 request type (%r)" % command) - return False - elif not words: - return False - else: - self.send_error(400, "Bad request syntax (%r)" % requestline) - return False - self.command, self.path, self.request_version = command, path, version - - # Examine the headers and look for a Connection directive - self.headers = self.MessageClass(self.rfile, 0) - - conntype = self.headers.get('Connection', "") - if conntype.lower() == 'close': - self.close_connection = 1 - elif (conntype.lower() == 'keep-alive' and - self.protocol_version >= "HTTP/1.1"): - self.close_connection = 0 - return True - - def handle_one_request(self): - """Handle a single HTTP request. - - You normally don't need to override this method; see the class - __doc__ string for information on how to handle specific HTTP - commands such as GET and POST. - - """ - try: - self.raw_requestline = self.rfile.readline(65537) - if len(self.raw_requestline) > 65536: - self.requestline = '' - self.request_version = '' - self.command = '' - self.send_error(414) - return - if not self.raw_requestline: - self.close_connection = 1 - return - if not self.parse_request(): - # An error code has been sent, just exit - return - mname = 'do_' + self.command - if not hasattr(self, mname): - self.send_error(501, "Unsupported method (%r)" % self.command) - return - method = getattr(self, mname) - method() - self.wfile.flush() #actually send the response if not already done. - except socket.timeout: - #a read or a write timed out. Discard this connection - self.log_error("Request timed out: %r", sys.exc_info()[1]) - self.close_connection = 1 - return - - def handle(self): - """Handle multiple requests if necessary.""" - self.close_connection = 1 - - self.handle_one_request() - while not self.close_connection: - self.handle_one_request() - - def send_error(self, code, message=None): - """Send and log an error reply. - - Arguments are the error code, and a detailed message. - The detailed message defaults to the short entry matching the - response code. - - This sends an error response (so it must be called before any - output has been generated), logs the error, and finally sends - a piece of HTML explaining the error to the user. - - """ - - try: - short, long = self.responses[code] - except KeyError: - short, long = '???', '???' - if message is None: - message = short - explain = long - self.log_error("code %d, message %s", code, message) - # using _quote_html to prevent Cross Site Scripting attacks (see bug #1100201) - content = (self.error_message_format % - {'code': code, 'message': _quote_html(message), 'explain': explain}) - self.send_response(code, message) - self.send_header("Content-Type", self.error_content_type) - self.send_header('Connection', 'close') - self.end_headers() - if self.command != 'HEAD' and code >= 200 and code not in (204, 304): - self.wfile.write(content) - - error_message_format = DEFAULT_ERROR_MESSAGE - error_content_type = DEFAULT_ERROR_CONTENT_TYPE - - def send_response(self, code, message=None): - """Send the response header and log the response code. - - Also send two standard headers with the server software - version and the current date. - - """ - self.log_request(code) - if message is None: - if code in self.responses: - message = self.responses[code][0] - else: - message = '' - if self.request_version != 'HTTP/0.9': - self.wfile.write("%s %d %s\r\n" % - (self.protocol_version, code, message)) - # print (self.protocol_version, code, message) - self.send_header('Server', self.version_string()) - self.send_header('Date', self.date_time_string()) - - def send_header(self, keyword, value): - """Send a MIME header.""" - if self.request_version != 'HTTP/0.9': - self.wfile.write("%s: %s\r\n" % (keyword, value)) - - if keyword.lower() == 'connection': - if value.lower() == 'close': - self.close_connection = 1 - elif value.lower() == 'keep-alive': - self.close_connection = 0 - - def end_headers(self): - """Send the blank line ending the MIME headers.""" - if self.request_version != 'HTTP/0.9': - self.wfile.write("\r\n") - - def log_request(self, code='-', size='-'): - """Log an accepted request. - - This is called by send_response(). - - """ - - self.log_message('"%s" %s %s', - self.requestline, str(code), str(size)) - - def log_error(self, format, *args): - """Log an error. - - This is called when a request cannot be fulfilled. By - default it passes the message on to log_message(). - - Arguments are the same as for log_message(). - - XXX This should go to the separate error log. - - """ - - self.log_message(format, *args) - - def log_message(self, format, *args): - """Log an arbitrary message. - - This is used by all other logging functions. Override - it if you have specific logging wishes. - - The first argument, FORMAT, is a format string for the - message to be logged. If the format string contains - any % escapes requiring parameters, they should be - specified as subsequent arguments (it's just like - printf!). - - The client host and current date/time are prefixed to - every message. - - """ - - sys.stderr.write("%s - - [%s] %s\n" % - (self.address_string(), - self.log_date_time_string(), - format%args)) - - def version_string(self): - """Return the server software version string.""" - return self.server_version + ' ' + self.sys_version - - def date_time_string(self, timestamp=None): - """Return the current date and time formatted for a message header.""" - if timestamp is None: - timestamp = time.time() - year, month, day, hh, mm, ss, wd, y, z = time.gmtime(timestamp) - s = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % ( - self.weekdayname[wd], - day, self.monthname[month], year, - hh, mm, ss) - return s - - def log_date_time_string(self): - """Return the current time formatted for logging.""" - now = time.time() - year, month, day, hh, mm, ss, x, y, z = time.localtime(now) - s = "%02d/%3s/%04d %02d:%02d:%02d" % ( - day, self.monthname[month], year, hh, mm, ss) - return s - - weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] - - monthname = [None, - 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', - 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] - - def address_string(self): - """Return the client address formatted for logging. - - This version looks up the full hostname using gethostbyaddr(), - and tries to find a name that contains at least one dot. - - """ - - host, port = self.client_address[:2] - return socket.getfqdn(host) - - # Essentially static class variables - - # The version of the HTTP protocol we support. - # Set this to HTTP/1.1 to enable automatic keepalive - protocol_version = "HTTP/1.0" - - # The Message-like class used to parse headers - MessageClass = mimetools.Message - - # Table mapping response codes to messages; entries have the - # form {code: (shortmessage, longmessage)}. - # See RFC 2616. - responses = { - 100: ('Continue', 'Request received, please continue'), - 101: ('Switching Protocols', - 'Switching to new protocol; obey Upgrade header'), - - 200: ('OK', 'Request fulfilled, document follows'), - 201: ('Created', 'Document created, URL follows'), - 202: ('Accepted', - 'Request accepted, processing continues off-line'), - 203: ('Non-Authoritative Information', 'Request fulfilled from cache'), - 204: ('No Content', 'Request fulfilled, nothing follows'), - 205: ('Reset Content', 'Clear input form for further input.'), - 206: ('Partial Content', 'Partial content follows.'), - - 300: ('Multiple Choices', - 'Object has several resources -- see URI list'), - 301: ('Moved Permanently', 'Object moved permanently -- see URI list'), - 302: ('Found', 'Object moved temporarily -- see URI list'), - 303: ('See Other', 'Object moved -- see Method and URL list'), - 304: ('Not Modified', - 'Document has not changed since given time'), - 305: ('Use Proxy', - 'You must use proxy specified in Location to access this ' - 'resource.'), - 307: ('Temporary Redirect', - 'Object moved temporarily -- see URI list'), - - 400: ('Bad Request', - 'Bad request syntax or unsupported method'), - 401: ('Unauthorized', - 'No permission -- see authorization schemes'), - 402: ('Payment Required', - 'No payment -- see charging schemes'), - 403: ('Forbidden', - 'Request forbidden -- authorization will not help'), - 404: ('Not Found', 'Nothing matches the given URI'), - 405: ('Method Not Allowed', - 'Specified method is invalid for this resource.'), - 406: ('Not Acceptable', 'URI not available in preferred format.'), - 407: ('Proxy Authentication Required', 'You must authenticate with ' - 'this proxy before proceeding.'), - 408: ('Request Timeout', 'Request timed out; try again later.'), - 409: ('Conflict', 'Request conflict.'), - 410: ('Gone', - 'URI no longer exists and has been permanently removed.'), - 411: ('Length Required', 'Client must specify Content-Length.'), - 412: ('Precondition Failed', 'Precondition in headers is false.'), - 413: ('Request Entity Too Large', 'Entity is too large.'), - 414: ('Request-URI Too Long', 'URI is too long.'), - 415: ('Unsupported Media Type', 'Entity body in unsupported format.'), - 416: ('Requested Range Not Satisfiable', - 'Cannot satisfy request range.'), - 417: ('Expectation Failed', - 'Expect condition could not be satisfied.'), - - 500: ('Internal Server Error', 'Server got itself in trouble'), - 501: ('Not Implemented', - 'Server does not support this operation'), - 502: ('Bad Gateway', 'Invalid responses from another server/proxy.'), - 503: ('Service Unavailable', - 'The server cannot process the request due to a high load'), - 504: ('Gateway Timeout', - 'The gateway server did not receive a timely response'), - 505: ('HTTP Version Not Supported', 'Cannot fulfill request.'), - } - - -def test(HandlerClass = BaseHTTPRequestHandler, - ServerClass = HTTPServer, protocol="HTTP/1.0"): - """Test the HTTP request handler class. - - This runs an HTTP server on port 8000 (or the first command line - argument). - - """ - - if sys.argv[1:]: - port = int(sys.argv[1]) - else: - port = 8000 - server_address = ('', port) - - HandlerClass.protocol_version = protocol - httpd = ServerClass(server_address, HandlerClass) - - sa = httpd.socket.getsockname() - print ("Serving HTTP on", sa[0], "port", sa[1], "...") - httpd.serve_forever() - - -if __name__ == '__main__': - test() diff --git a/python/helpers/pydev/_pydev_Queue.py b/python/helpers/pydev/_pydev_Queue.py deleted file mode 100644 index cc32ea6932d6..000000000000 --- a/python/helpers/pydev/_pydev_Queue.py +++ /dev/null @@ -1,244 +0,0 @@ -"""A multi-producer, multi-consumer queue.""" - -from _pydev_time import time as _time -try: - import _pydev_threading as _threading -except ImportError: - import dummy_threading as _threading -from collections import deque -import heapq - -__all__ = ['Empty', 'Full', 'Queue', 'PriorityQueue', 'LifoQueue'] - -class Empty(Exception): - "Exception raised by Queue.get(block=0)/get_nowait()." - pass - -class Full(Exception): - "Exception raised by Queue.put(block=0)/put_nowait()." - pass - -class Queue: - """Create a queue object with a given maximum size. - - If maxsize is <= 0, the queue size is infinite. - """ - def __init__(self, maxsize=0): - self.maxsize = maxsize - self._init(maxsize) - # mutex must be held whenever the queue is mutating. All methods - # that acquire mutex must release it before returning. mutex - # is shared between the three conditions, so acquiring and - # releasing the conditions also acquires and releases mutex. - self.mutex = _threading.Lock() - # Notify not_empty whenever an item is added to the queue; a - # thread waiting to get is notified then. - self.not_empty = _threading.Condition(self.mutex) - # Notify not_full whenever an item is removed from the queue; - # a thread waiting to put is notified then. - self.not_full = _threading.Condition(self.mutex) - # Notify all_tasks_done whenever the number of unfinished tasks - # drops to zero; thread waiting to join() is notified to resume - self.all_tasks_done = _threading.Condition(self.mutex) - self.unfinished_tasks = 0 - - def task_done(self): - """Indicate that a formerly enqueued task is complete. - - Used by Queue consumer threads. For each get() used to fetch a task, - a subsequent call to task_done() tells the queue that the processing - on the task is complete. - - If a join() is currently blocking, it will resume when all items - have been processed (meaning that a task_done() call was received - for every item that had been put() into the queue). - - Raises a ValueError if called more times than there were items - placed in the queue. - """ - self.all_tasks_done.acquire() - try: - unfinished = self.unfinished_tasks - 1 - if unfinished <= 0: - if unfinished < 0: - raise ValueError('task_done() called too many times') - self.all_tasks_done.notify_all() - self.unfinished_tasks = unfinished - finally: - self.all_tasks_done.release() - - def join(self): - """Blocks until all items in the Queue have been gotten and processed. - - The count of unfinished tasks goes up whenever an item is added to the - queue. The count goes down whenever a consumer thread calls task_done() - to indicate the item was retrieved and all work on it is complete. - - When the count of unfinished tasks drops to zero, join() unblocks. - """ - self.all_tasks_done.acquire() - try: - while self.unfinished_tasks: - self.all_tasks_done.wait() - finally: - self.all_tasks_done.release() - - def qsize(self): - """Return the approximate size of the queue (not reliable!).""" - self.mutex.acquire() - n = self._qsize() - self.mutex.release() - return n - - def empty(self): - """Return True if the queue is empty, False otherwise (not reliable!).""" - self.mutex.acquire() - n = not self._qsize() - self.mutex.release() - return n - - def full(self): - """Return True if the queue is full, False otherwise (not reliable!).""" - self.mutex.acquire() - n = 0 < self.maxsize == self._qsize() - self.mutex.release() - return n - - def put(self, item, block=True, timeout=None): - """Put an item into the queue. - - If optional args 'block' is true and 'timeout' is None (the default), - block if necessary until a free slot is available. If 'timeout' is - a positive number, it blocks at most 'timeout' seconds and raises - the Full exception if no free slot was available within that time. - Otherwise ('block' is false), put an item on the queue if a free slot - is immediately available, else raise the Full exception ('timeout' - is ignored in that case). - """ - self.not_full.acquire() - try: - if self.maxsize > 0: - if not block: - if self._qsize() == self.maxsize: - raise Full - elif timeout is None: - while self._qsize() == self.maxsize: - self.not_full.wait() - elif timeout < 0: - raise ValueError("'timeout' must be a positive number") - else: - endtime = _time() + timeout - while self._qsize() == self.maxsize: - remaining = endtime - _time() - if remaining <= 0.0: - raise Full - self.not_full.wait(remaining) - self._put(item) - self.unfinished_tasks += 1 - self.not_empty.notify() - finally: - self.not_full.release() - - def put_nowait(self, item): - """Put an item into the queue without blocking. - - Only enqueue the item if a free slot is immediately available. - Otherwise raise the Full exception. - """ - return self.put(item, False) - - def get(self, block=True, timeout=None): - """Remove and return an item from the queue. - - If optional args 'block' is true and 'timeout' is None (the default), - block if necessary until an item is available. If 'timeout' is - a positive number, it blocks at most 'timeout' seconds and raises - the Empty exception if no item was available within that time. - Otherwise ('block' is false), return an item if one is immediately - available, else raise the Empty exception ('timeout' is ignored - in that case). - """ - self.not_empty.acquire() - try: - if not block: - if not self._qsize(): - raise Empty - elif timeout is None: - while not self._qsize(): - self.not_empty.wait() - elif timeout < 0: - raise ValueError("'timeout' must be a positive number") - else: - endtime = _time() + timeout - while not self._qsize(): - remaining = endtime - _time() - if remaining <= 0.0: - raise Empty - self.not_empty.wait(remaining) - item = self._get() - self.not_full.notify() - return item - finally: - self.not_empty.release() - - def get_nowait(self): - """Remove and return an item from the queue without blocking. - - Only get an item if one is immediately available. Otherwise - raise the Empty exception. - """ - return self.get(False) - - # Override these methods to implement other queue organizations - # (e.g. stack or priority queue). - # These will only be called with appropriate locks held - - # Initialize the queue representation - def _init(self, maxsize): - self.queue = deque() - - def _qsize(self, len=len): - return len(self.queue) - - # Put a new item in the queue - def _put(self, item): - self.queue.append(item) - - # Get an item from the queue - def _get(self): - return self.queue.popleft() - - -class PriorityQueue(Queue): - '''Variant of Queue that retrieves open entries in priority order (lowest first). - - Entries are typically tuples of the form: (priority number, data). - ''' - - def _init(self, maxsize): - self.queue = [] - - def _qsize(self, len=len): - return len(self.queue) - - def _put(self, item, heappush=heapq.heappush): - heappush(self.queue, item) - - def _get(self, heappop=heapq.heappop): - return heappop(self.queue) - - -class LifoQueue(Queue): - '''Variant of Queue that retrieves most recently added entries first.''' - - def _init(self, maxsize): - self.queue = [] - - def _qsize(self, len=len): - return len(self.queue) - - def _put(self, item): - self.queue.append(item) - - def _get(self): - return self.queue.pop() diff --git a/python/helpers/pydev/_pydev_SimpleXMLRPCServer.py b/python/helpers/pydev/_pydev_SimpleXMLRPCServer.py deleted file mode 100644 index c7da5b7fecdf..000000000000 --- a/python/helpers/pydev/_pydev_SimpleXMLRPCServer.py +++ /dev/null @@ -1,610 +0,0 @@ -#Just a copy of the version in python 2.5 to be used if it's not available in jython 2.1 - -"""Simple XML-RPC Server. - -This module can be used to create simple XML-RPC servers -by creating a server and either installing functions, a -class instance, or by extending the SimpleXMLRPCServer -class. - -It can also be used to handle XML-RPC requests in a CGI -environment using CGIXMLRPCRequestHandler. - -A list of possible usage patterns follows: - -1. Install functions: - -server = SimpleXMLRPCServer(("localhost", 8000)) -server.register_function(pow) -server.register_function(lambda x,y: x+y, 'add') -server.serve_forever() - -2. Install an instance: - -class MyFuncs: - def __init__(self): - # make all of the string functions available through - # string.func_name - import string - self.string = string - def _listMethods(self): - # implement this method so that system.listMethods - # knows to advertise the strings methods - return list_public_methods(self) + \ - ['string.' + method for method in list_public_methods(self.string)] - def pow(self, x, y): return pow(x, y) - def add(self, x, y) : return x + y - -server = SimpleXMLRPCServer(("localhost", 8000)) -server.register_introspection_functions() -server.register_instance(MyFuncs()) -server.serve_forever() - -3. Install an instance with custom dispatch method: - -class Math: - def _listMethods(self): - # this method must be present for system.listMethods - # to work - return ['add', 'pow'] - def _methodHelp(self, method): - # this method must be present for system.methodHelp - # to work - if method == 'add': - return "add(2,3) => 5" - elif method == 'pow': - return "pow(x, y[, z]) => number" - else: - # By convention, return empty - # string if no help is available - return "" - def _dispatch(self, method, params): - if method == 'pow': - return pow(*params) - elif method == 'add': - return params[0] + params[1] - else: - raise 'bad method' - -server = SimpleXMLRPCServer(("localhost", 8000)) -server.register_introspection_functions() -server.register_instance(Math()) -server.serve_forever() - -4. Subclass SimpleXMLRPCServer: - -class MathServer(SimpleXMLRPCServer): - def _dispatch(self, method, params): - try: - # We are forcing the 'export_' prefix on methods that are - # callable through XML-RPC to prevent potential security - # problems - func = getattr(self, 'export_' + method) - except AttributeError: - raise Exception('method "%s" is not supported' % method) - else: - return func(*params) - - def export_add(self, x, y): - return x + y - -server = MathServer(("localhost", 8000)) -server.serve_forever() - -5. CGI script: - -server = CGIXMLRPCRequestHandler() -server.register_function(pow) -server.handle_request() -""" - -# Written by Brian Quinlan (brian@sweetapp.com). -# Based on code written by Fredrik Lundh. - -try: - True - False -except: - import __builtin__ - setattr(__builtin__, 'True', 1) #Python 3.0 does not accept __builtin__.True = 1 in its syntax - setattr(__builtin__, 'False', 0) - - -import _pydev_xmlrpclib as xmlrpclib -from _pydev_xmlrpclib import Fault -import _pydev_SocketServer as SocketServer -import _pydev_BaseHTTPServer as BaseHTTPServer -import sys -import os -try: - import fcntl -except ImportError: - fcntl = None - -def resolve_dotted_attribute(obj, attr, allow_dotted_names=True): - """resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d - - Resolves a dotted attribute name to an object. Raises - an AttributeError if any attribute in the chain starts with a '_'. - - If the optional allow_dotted_names argument is false, dots are not - supported and this function operates similar to getattr(obj, attr). - """ - - if allow_dotted_names: - attrs = attr.split('.') - else: - attrs = [attr] - - for i in attrs: - if i.startswith('_'): - raise AttributeError( - 'attempt to access private attribute "%s"' % i - ) - else: - obj = getattr(obj, i) - return obj - -def list_public_methods(obj): - """Returns a list of attribute strings, found in the specified - object, which represent callable attributes""" - - return [member for member in dir(obj) - if not member.startswith('_') and - callable(getattr(obj, member))] - -def remove_duplicates(lst): - """remove_duplicates([2,2,2,1,3,3]) => [3,1,2] - - Returns a copy of a list without duplicates. Every list - item must be hashable and the order of the items in the - resulting list is not defined. - """ - u = {} - for x in lst: - u[x] = 1 - - return u.keys() - -class SimpleXMLRPCDispatcher: - """Mix-in class that dispatches XML-RPC requests. - - This class is used to register XML-RPC method handlers - and then to dispatch them. There should never be any - reason to instantiate this class directly. - """ - - def __init__(self, allow_none, encoding): - self.funcs = {} - self.instance = None - self.allow_none = allow_none - self.encoding = encoding - - def register_instance(self, instance, allow_dotted_names=False): - """Registers an instance to respond to XML-RPC requests. - - Only one instance can be installed at a time. - - If the registered instance has a _dispatch method then that - method will be called with the name of the XML-RPC method and - its parameters as a tuple - e.g. instance._dispatch('add',(2,3)) - - If the registered instance does not have a _dispatch method - then the instance will be searched to find a matching method - and, if found, will be called. Methods beginning with an '_' - are considered private and will not be called by - SimpleXMLRPCServer. - - If a registered function matches a XML-RPC request, then it - will be called instead of the registered instance. - - If the optional allow_dotted_names argument is true and the - instance does not have a _dispatch method, method names - containing dots are supported and resolved, as long as none of - the name segments start with an '_'. - - *** SECURITY WARNING: *** - - Enabling the allow_dotted_names options allows intruders - to access your module's global variables and may allow - intruders to execute arbitrary code on your machine. Only - use this option on a secure, closed network. - - """ - - self.instance = instance - self.allow_dotted_names = allow_dotted_names - - def register_function(self, function, name=None): - """Registers a function to respond to XML-RPC requests. - - The optional name argument can be used to set a Unicode name - for the function. - """ - - if name is None: - name = function.__name__ - self.funcs[name] = function - - def register_introspection_functions(self): - """Registers the XML-RPC introspection methods in the system - namespace. - - see http://xmlrpc.usefulinc.com/doc/reserved.html - """ - - self.funcs.update({'system.listMethods' : self.system_listMethods, - 'system.methodSignature' : self.system_methodSignature, - 'system.methodHelp' : self.system_methodHelp}) - - def register_multicall_functions(self): - """Registers the XML-RPC multicall method in the system - namespace. - - see http://www.xmlrpc.com/discuss/msgReader$1208""" - - self.funcs.update({'system.multicall' : self.system_multicall}) - - def _marshaled_dispatch(self, data, dispatch_method=None): - """Dispatches an XML-RPC method from marshalled (XML) data. - - XML-RPC methods are dispatched from the marshalled (XML) data - using the _dispatch method and the result is returned as - marshalled data. For backwards compatibility, a dispatch - function can be provided as an argument (see comment in - SimpleXMLRPCRequestHandler.do_POST) but overriding the - existing method through subclassing is the prefered means - of changing method dispatch behavior. - """ - try: - params, method = xmlrpclib.loads(data) - - # generate response - if dispatch_method is not None: - response = dispatch_method(method, params) - else: - response = self._dispatch(method, params) - # wrap response in a singleton tuple - response = (response,) - response = xmlrpclib.dumps(response, methodresponse=1, - allow_none=self.allow_none, encoding=self.encoding) - except Fault, fault: - response = xmlrpclib.dumps(fault, allow_none=self.allow_none, - encoding=self.encoding) - except: - # report exception back to server - response = xmlrpclib.dumps( - xmlrpclib.Fault(1, "%s:%s" % (sys.exc_type, sys.exc_value)), #@UndefinedVariable exc_value only available when we actually have an exception - encoding=self.encoding, allow_none=self.allow_none, - ) - - return response - - def system_listMethods(self): - """system.listMethods() => ['add', 'subtract', 'multiple'] - - Returns a list of the methods supported by the server.""" - - methods = self.funcs.keys() - if self.instance is not None: - # Instance can implement _listMethod to return a list of - # methods - if hasattr(self.instance, '_listMethods'): - methods = remove_duplicates( - methods + self.instance._listMethods() - ) - # if the instance has a _dispatch method then we - # don't have enough information to provide a list - # of methods - elif not hasattr(self.instance, '_dispatch'): - methods = remove_duplicates( - methods + list_public_methods(self.instance) - ) - methods.sort() - return methods - - def system_methodSignature(self, method_name): - """system.methodSignature('add') => [double, int, int] - - Returns a list describing the signature of the method. In the - above example, the add method takes two integers as arguments - and returns a double result. - - This server does NOT support system.methodSignature.""" - - # See http://xmlrpc.usefulinc.com/doc/sysmethodsig.html - - return 'signatures not supported' - - def system_methodHelp(self, method_name): - """system.methodHelp('add') => "Adds two integers together" - - Returns a string containing documentation for the specified method.""" - - method = None - if self.funcs.has_key(method_name): - method = self.funcs[method_name] - elif self.instance is not None: - # Instance can implement _methodHelp to return help for a method - if hasattr(self.instance, '_methodHelp'): - return self.instance._methodHelp(method_name) - # if the instance has a _dispatch method then we - # don't have enough information to provide help - elif not hasattr(self.instance, '_dispatch'): - try: - method = resolve_dotted_attribute( - self.instance, - method_name, - self.allow_dotted_names - ) - except AttributeError: - pass - - # Note that we aren't checking that the method actually - # be a callable object of some kind - if method is None: - return "" - else: - try: - import pydoc - except ImportError: - return "" #not there for jython - else: - return pydoc.getdoc(method) - - def system_multicall(self, call_list): - """system.multicall([{'methodName': 'add', 'params': [2, 2]}, ...]) => \ -[[4], ...] - - Allows the caller to package multiple XML-RPC calls into a single - request. - - See http://www.xmlrpc.com/discuss/msgReader$1208 - """ - - results = [] - for call in call_list: - method_name = call['methodName'] - params = call['params'] - - try: - # XXX A marshalling error in any response will fail the entire - # multicall. If someone cares they should fix this. - results.append([self._dispatch(method_name, params)]) - except Fault, fault: - results.append( - {'faultCode' : fault.faultCode, - 'faultString' : fault.faultString} - ) - except: - results.append( - {'faultCode' : 1, - 'faultString' : "%s:%s" % (sys.exc_type, sys.exc_value)} #@UndefinedVariable exc_value only available when we actually have an exception - ) - return results - - def _dispatch(self, method, params): - """Dispatches the XML-RPC method. - - XML-RPC calls are forwarded to a registered function that - matches the called XML-RPC method name. If no such function - exists then the call is forwarded to the registered instance, - if available. - - If the registered instance has a _dispatch method then that - method will be called with the name of the XML-RPC method and - its parameters as a tuple - e.g. instance._dispatch('add',(2,3)) - - If the registered instance does not have a _dispatch method - then the instance will be searched to find a matching method - and, if found, will be called. - - Methods beginning with an '_' are considered private and will - not be called. - """ - - func = None - try: - # check to see if a matching function has been registered - func = self.funcs[method] - except KeyError: - if self.instance is not None: - # check for a _dispatch method - if hasattr(self.instance, '_dispatch'): - return self.instance._dispatch(method, params) - else: - # call instance method directly - try: - func = resolve_dotted_attribute( - self.instance, - method, - self.allow_dotted_names - ) - except AttributeError: - pass - - if func is not None: - return func(*params) - else: - raise Exception('method "%s" is not supported' % method) - -class SimpleXMLRPCRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): - """Simple XML-RPC request handler class. - - Handles all HTTP POST requests and attempts to decode them as - XML-RPC requests. - """ - - # Class attribute listing the accessible path components; - # paths not on this list will result in a 404 error. - rpc_paths = ('/', '/RPC2') - - def is_rpc_path_valid(self): - if self.rpc_paths: - return self.path in self.rpc_paths - else: - # If .rpc_paths is empty, just assume all paths are legal - return True - - def do_POST(self): - """Handles the HTTP POST request. - - Attempts to interpret all HTTP POST requests as XML-RPC calls, - which are forwarded to the server's _dispatch method for handling. - """ - - # Check that the path is legal - if not self.is_rpc_path_valid(): - self.report_404() - return - - try: - # Get arguments by reading body of request. - # We read this in chunks to avoid straining - # socket.read(); around the 10 or 15Mb mark, some platforms - # begin to have problems (bug #792570). - max_chunk_size = 10 * 1024 * 1024 - size_remaining = int(self.headers["content-length"]) - L = [] - while size_remaining: - chunk_size = min(size_remaining, max_chunk_size) - L.append(self.rfile.read(chunk_size)) - size_remaining -= len(L[-1]) - data = ''.join(L) - - # In previous versions of SimpleXMLRPCServer, _dispatch - # could be overridden in this class, instead of in - # SimpleXMLRPCDispatcher. To maintain backwards compatibility, - # check to see if a subclass implements _dispatch and dispatch - # using that method if present. - response = self.server._marshaled_dispatch( - data, getattr(self, '_dispatch', None) - ) - except: # This should only happen if the module is buggy - # internal error, report as HTTP server error - self.send_response(500) - self.end_headers() - else: - # got a valid XML RPC response - self.send_response(200) - self.send_header("Content-type", "text/xml") - self.send_header("Content-length", str(len(response))) - self.end_headers() - self.wfile.write(response) - - # shut down the connection - self.wfile.flush() - self.connection.shutdown(1) - - def report_404 (self): - # Report a 404 error - self.send_response(404) - response = 'No such page' - self.send_header("Content-type", "text/plain") - self.send_header("Content-length", str(len(response))) - self.end_headers() - self.wfile.write(response) - # shut down the connection - self.wfile.flush() - self.connection.shutdown(1) - - def log_request(self, code='-', size='-'): - """Selectively log an accepted request.""" - - if self.server.logRequests: - BaseHTTPServer.BaseHTTPRequestHandler.log_request(self, code, size) - -class SimpleXMLRPCServer(SocketServer.TCPServer, - SimpleXMLRPCDispatcher): - """Simple XML-RPC server. - - Simple XML-RPC server that allows functions and a single instance - to be installed to handle requests. The default implementation - attempts to dispatch XML-RPC calls to the functions or instance - installed in the server. Override the _dispatch method inhereted - from SimpleXMLRPCDispatcher to change this behavior. - """ - - allow_reuse_address = True - - def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler, - logRequests=True, allow_none=False, encoding=None): - self.logRequests = logRequests - - SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding) - SocketServer.TCPServer.__init__(self, addr, requestHandler) - - # [Bug #1222790] If possible, set close-on-exec flag; if a - # method spawns a subprocess, the subprocess shouldn't have - # the listening socket open. - if fcntl is not None and hasattr(fcntl, 'FD_CLOEXEC'): - flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD) - flags |= fcntl.FD_CLOEXEC - fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags) - -class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher): - """Simple handler for XML-RPC data passed through CGI.""" - - def __init__(self, allow_none=False, encoding=None): - SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding) - - def handle_xmlrpc(self, request_text): - """Handle a single XML-RPC request""" - - response = self._marshaled_dispatch(request_text) - - sys.stdout.write('Content-Type: text/xml\n') - sys.stdout.write('Content-Length: %d\n' % len(response)) - sys.stdout.write('\n') - - sys.stdout.write(response) - - def handle_get(self): - """Handle a single HTTP GET request. - - Default implementation indicates an error because - XML-RPC uses the POST method. - """ - - code = 400 - message, explain = \ - BaseHTTPServer.BaseHTTPRequestHandler.responses[code] - - response = BaseHTTPServer.DEFAULT_ERROR_MESSAGE % { #@UndefinedVariable - 'code' : code, - 'message' : message, - 'explain' : explain - } - sys.stdout.write('Status: %d %s\n' % (code, message)) - sys.stdout.write('Content-Type: text/html\n') - sys.stdout.write('Content-Length: %d\n' % len(response)) - sys.stdout.write('\n') - - sys.stdout.write(response) - - def handle_request(self, request_text=None): - """Handle a single XML-RPC request passed through a CGI post method. - - If no XML data is given then it is read from stdin. The resulting - XML-RPC response is printed to stdout along with the correct HTTP - headers. - """ - - if request_text is None and \ - os.environ.get('REQUEST_METHOD', None) == 'GET': - self.handle_get() - else: - # POST data is normally available through stdin - if request_text is None: - request_text = sys.stdin.read() - - self.handle_xmlrpc(request_text) - -if __name__ == '__main__': - sys.stdout.write('Running XML-RPC server on port 8000\n') - server = SimpleXMLRPCServer(("localhost", 8000)) - server.register_function(pow) - server.register_function(lambda x, y: x + y, 'add') - server.serve_forever() diff --git a/python/helpers/pydev/_pydev_SocketServer.py b/python/helpers/pydev/_pydev_SocketServer.py deleted file mode 100644 index c61112613a84..000000000000 --- a/python/helpers/pydev/_pydev_SocketServer.py +++ /dev/null @@ -1,715 +0,0 @@ -"""Generic socket server classes. - -This module tries to capture the various aspects of defining a server: - -For socket-based servers: - -- address family: - - AF_INET{,6}: IP (Internet Protocol) sockets (default) - - AF_UNIX: Unix domain sockets - - others, e.g. AF_DECNET are conceivable (see -- socket type: - - SOCK_STREAM (reliable stream, e.g. TCP) - - SOCK_DGRAM (datagrams, e.g. UDP) - -For request-based servers (including socket-based): - -- client address verification before further looking at the request - (This is actually a hook for any processing that needs to look - at the request before anything else, e.g. logging) -- how to handle multiple requests: - - synchronous (one request is handled at a time) - - forking (each request is handled by a new process) - - threading (each request is handled by a new thread) - -The classes in this module favor the server type that is simplest to -write: a synchronous TCP/IP server. This is bad class design, but -save some typing. (There's also the issue that a deep class hierarchy -slows down method lookups.) - -There are five classes in an inheritance diagram, four of which represent -synchronous servers of four types: - - +------------+ - | BaseServer | - +------------+ - | - v - +-----------+ +------------------+ - | TCPServer |------->| UnixStreamServer | - +-----------+ +------------------+ - | - v - +-----------+ +--------------------+ - | UDPServer |------->| UnixDatagramServer | - +-----------+ +--------------------+ - -Note that UnixDatagramServer derives from UDPServer, not from -UnixStreamServer -- the only difference between an IP and a Unix -stream server is the address family, which is simply repeated in both -unix server classes. - -Forking and threading versions of each type of server can be created -using the ForkingMixIn and ThreadingMixIn mix-in classes. For -instance, a threading UDP server class is created as follows: - - class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass - -The Mix-in class must come first, since it overrides a method defined -in UDPServer! Setting the various member variables also changes -the behavior of the underlying server mechanism. - -To implement a service, you must derive a class from -BaseRequestHandler and redefine its handle() method. You can then run -various versions of the service by combining one of the server classes -with your request handler class. - -The request handler class must be different for datagram or stream -services. This can be hidden by using the request handler -subclasses StreamRequestHandler or DatagramRequestHandler. - -Of course, you still have to use your head! - -For instance, it makes no sense to use a forking server if the service -contains state in memory that can be modified by requests (since the -modifications in the child process would never reach the initial state -kept in the parent process and passed to each child). In this case, -you can use a threading server, but you will probably have to use -locks to avoid two requests that come in nearly simultaneous to apply -conflicting changes to the server state. - -On the other hand, if you are building e.g. an HTTP server, where all -data is stored externally (e.g. in the file system), a synchronous -class will essentially render the service "deaf" while one request is -being handled -- which may be for a very long time if a client is slow -to read all the data it has requested. Here a threading or forking -server is appropriate. - -In some cases, it may be appropriate to process part of a request -synchronously, but to finish processing in a forked child depending on -the request data. This can be implemented by using a synchronous -server and doing an explicit fork in the request handler class -handle() method. - -Another approach to handling multiple simultaneous requests in an -environment that supports neither threads nor fork (or where these are -too expensive or inappropriate for the service) is to maintain an -explicit table of partially finished requests and to use select() to -decide which request to work on next (or whether to handle a new -incoming request). This is particularly important for stream services -where each client can potentially be connected for a long time (if -threads or subprocesses cannot be used). - -Future work: -- Standard classes for Sun RPC (which uses either UDP or TCP) -- Standard mix-in classes to implement various authentication - and encryption schemes -- Standard framework for select-based multiplexing - -XXX Open problems: -- What to do with out-of-band data? - -BaseServer: -- split generic "request" functionality out into BaseServer class. - Copyright (C) 2000 Luke Kenneth Casson Leighton - - example: read entries from a SQL database (requires overriding - get_request() to return a table entry from the database). - entry is processed by a RequestHandlerClass. - -""" - -# Author of the BaseServer patch: Luke Kenneth Casson Leighton - -# XXX Warning! -# There is a test suite for this module, but it cannot be run by the -# standard regression test. -# To run it manually, run Lib/test/test_socketserver.py. - -__version__ = "0.4" - - -import _pydev_socket as socket -import _pydev_select as select -import sys -import os -try: - import _pydev_threading as threading -except ImportError: - import dummy_threading as threading - -__all__ = ["TCPServer","UDPServer","ForkingUDPServer","ForkingTCPServer", - "ThreadingUDPServer","ThreadingTCPServer","BaseRequestHandler", - "StreamRequestHandler","DatagramRequestHandler", - "ThreadingMixIn", "ForkingMixIn"] -if hasattr(socket, "AF_UNIX"): - __all__.extend(["UnixStreamServer","UnixDatagramServer", - "ThreadingUnixStreamServer", - "ThreadingUnixDatagramServer"]) - -class BaseServer: - - """Base class for server classes. - - Methods for the caller: - - - __init__(server_address, RequestHandlerClass) - - serve_forever(poll_interval=0.5) - - shutdown() - - handle_request() # if you do not use serve_forever() - - fileno() -> int # for select() - - Methods that may be overridden: - - - server_bind() - - server_activate() - - get_request() -> request, client_address - - handle_timeout() - - verify_request(request, client_address) - - server_close() - - process_request(request, client_address) - - shutdown_request(request) - - close_request(request) - - handle_error() - - Methods for derived classes: - - - finish_request(request, client_address) - - Class variables that may be overridden by derived classes or - instances: - - - timeout - - address_family - - socket_type - - allow_reuse_address - - Instance variables: - - - RequestHandlerClass - - socket - - """ - - timeout = None - - def __init__(self, server_address, RequestHandlerClass): - """Constructor. May be extended, do not override.""" - self.server_address = server_address - self.RequestHandlerClass = RequestHandlerClass - self.__is_shut_down = threading.Event() - self.__shutdown_request = False - - def server_activate(self): - """Called by constructor to activate the server. - - May be overridden. - - """ - pass - - def serve_forever(self, poll_interval=0.5): - """Handle one request at a time until shutdown. - - Polls for shutdown every poll_interval seconds. Ignores - self.timeout. If you need to do periodic tasks, do them in - another thread. - """ - self.__is_shut_down.clear() - try: - while not self.__shutdown_request: - # XXX: Consider using another file descriptor or - # connecting to the socket to wake this up instead of - # polling. Polling reduces our responsiveness to a - # shutdown request and wastes cpu at all other times. - r, w, e = select.select([self], [], [], poll_interval) - if self in r: - self._handle_request_noblock() - finally: - self.__shutdown_request = False - self.__is_shut_down.set() - - def shutdown(self): - """Stops the serve_forever loop. - - Blocks until the loop has finished. This must be called while - serve_forever() is running in another thread, or it will - deadlock. - """ - self.__shutdown_request = True - self.__is_shut_down.wait() - - # The distinction between handling, getting, processing and - # finishing a request is fairly arbitrary. Remember: - # - # - handle_request() is the top-level call. It calls - # select, get_request(), verify_request() and process_request() - # - get_request() is different for stream or datagram sockets - # - process_request() is the place that may fork a new process - # or create a new thread to finish the request - # - finish_request() instantiates the request handler class; - # this constructor will handle the request all by itself - - def handle_request(self): - """Handle one request, possibly blocking. - - Respects self.timeout. - """ - # Support people who used socket.settimeout() to escape - # handle_request before self.timeout was available. - timeout = self.socket.gettimeout() - if timeout is None: - timeout = self.timeout - elif self.timeout is not None: - timeout = min(timeout, self.timeout) - fd_sets = select.select([self], [], [], timeout) - if not fd_sets[0]: - self.handle_timeout() - return - self._handle_request_noblock() - - def _handle_request_noblock(self): - """Handle one request, without blocking. - - I assume that select.select has returned that the socket is - readable before this function was called, so there should be - no risk of blocking in get_request(). - """ - try: - request, client_address = self.get_request() - except socket.error: - return - if self.verify_request(request, client_address): - try: - self.process_request(request, client_address) - except: - self.handle_error(request, client_address) - self.shutdown_request(request) - - def handle_timeout(self): - """Called if no new request arrives within self.timeout. - - Overridden by ForkingMixIn. - """ - pass - - def verify_request(self, request, client_address): - """Verify the request. May be overridden. - - Return True if we should proceed with this request. - - """ - return True - - def process_request(self, request, client_address): - """Call finish_request. - - Overridden by ForkingMixIn and ThreadingMixIn. - - """ - self.finish_request(request, client_address) - self.shutdown_request(request) - - def server_close(self): - """Called to clean-up the server. - - May be overridden. - - """ - pass - - def finish_request(self, request, client_address): - """Finish one request by instantiating RequestHandlerClass.""" - self.RequestHandlerClass(request, client_address, self) - - def shutdown_request(self, request): - """Called to shutdown and close an individual request.""" - self.close_request(request) - - def close_request(self, request): - """Called to clean up an individual request.""" - pass - - def handle_error(self, request, client_address): - """Handle an error gracefully. May be overridden. - - The default is to print a traceback and continue. - - """ - print '-'*40 - print 'Exception happened during processing of request from', - print client_address - import traceback - traceback.print_exc() # XXX But this goes to stderr! - print '-'*40 - - -class TCPServer(BaseServer): - - """Base class for various socket-based server classes. - - Defaults to synchronous IP stream (i.e., TCP). - - Methods for the caller: - - - __init__(server_address, RequestHandlerClass, bind_and_activate=True) - - serve_forever(poll_interval=0.5) - - shutdown() - - handle_request() # if you don't use serve_forever() - - fileno() -> int # for select() - - Methods that may be overridden: - - - server_bind() - - server_activate() - - get_request() -> request, client_address - - handle_timeout() - - verify_request(request, client_address) - - process_request(request, client_address) - - shutdown_request(request) - - close_request(request) - - handle_error() - - Methods for derived classes: - - - finish_request(request, client_address) - - Class variables that may be overridden by derived classes or - instances: - - - timeout - - address_family - - socket_type - - request_queue_size (only for stream sockets) - - allow_reuse_address - - Instance variables: - - - server_address - - RequestHandlerClass - - socket - - """ - - address_family = socket.AF_INET - - socket_type = socket.SOCK_STREAM - - request_queue_size = 5 - - allow_reuse_address = False - - def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True): - """Constructor. May be extended, do not override.""" - BaseServer.__init__(self, server_address, RequestHandlerClass) - self.socket = socket.socket(self.address_family, - self.socket_type) - if bind_and_activate: - self.server_bind() - self.server_activate() - - def server_bind(self): - """Called by constructor to bind the socket. - - May be overridden. - - """ - if self.allow_reuse_address: - self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - self.socket.bind(self.server_address) - self.server_address = self.socket.getsockname() - - def server_activate(self): - """Called by constructor to activate the server. - - May be overridden. - - """ - self.socket.listen(self.request_queue_size) - - def server_close(self): - """Called to clean-up the server. - - May be overridden. - - """ - self.socket.close() - - def fileno(self): - """Return socket file number. - - Interface required by select(). - - """ - return self.socket.fileno() - - def get_request(self): - """Get the request and client address from the socket. - - May be overridden. - - """ - return self.socket.accept() - - def shutdown_request(self, request): - """Called to shutdown and close an individual request.""" - try: - #explicitly shutdown. socket.close() merely releases - #the socket and waits for GC to perform the actual close. - request.shutdown(socket.SHUT_WR) - except socket.error: - pass #some platforms may raise ENOTCONN here - self.close_request(request) - - def close_request(self, request): - """Called to clean up an individual request.""" - request.close() - - -class UDPServer(TCPServer): - - """UDP server class.""" - - allow_reuse_address = False - - socket_type = socket.SOCK_DGRAM - - max_packet_size = 8192 - - def get_request(self): - data, client_addr = self.socket.recvfrom(self.max_packet_size) - return (data, self.socket), client_addr - - def server_activate(self): - # No need to call listen() for UDP. - pass - - def shutdown_request(self, request): - # No need to shutdown anything. - self.close_request(request) - - def close_request(self, request): - # No need to close anything. - pass - -class ForkingMixIn: - - """Mix-in class to handle each request in a new process.""" - - timeout = 300 - active_children = None - max_children = 40 - - def collect_children(self): - """Internal routine to wait for children that have exited.""" - if self.active_children is None: return - while len(self.active_children) >= self.max_children: - # XXX: This will wait for any child process, not just ones - # spawned by this library. This could confuse other - # libraries that expect to be able to wait for their own - # children. - try: - pid, status = os.waitpid(0, 0) - except os.error: - pid = None - if pid not in self.active_children: continue - self.active_children.remove(pid) - - # XXX: This loop runs more system calls than it ought - # to. There should be a way to put the active_children into a - # process group and then use os.waitpid(-pgid) to wait for any - # of that set, but I couldn't find a way to allocate pgids - # that couldn't collide. - for child in self.active_children: - try: - pid, status = os.waitpid(child, os.WNOHANG) - except os.error: - pid = None - if not pid: continue - try: - self.active_children.remove(pid) - except ValueError, e: - raise ValueError('%s. x=%d and list=%r' % (e.message, pid, - self.active_children)) - - def handle_timeout(self): - """Wait for zombies after self.timeout seconds of inactivity. - - May be extended, do not override. - """ - self.collect_children() - - def process_request(self, request, client_address): - """Fork a new subprocess to process the request.""" - self.collect_children() - pid = os.fork() - if pid: - # Parent process - if self.active_children is None: - self.active_children = [] - self.active_children.append(pid) - self.close_request(request) #close handle in parent process - return - else: - # Child process. - # This must never return, hence os._exit()! - try: - self.finish_request(request, client_address) - self.shutdown_request(request) - os._exit(0) - except: - try: - self.handle_error(request, client_address) - self.shutdown_request(request) - finally: - os._exit(1) - - -class ThreadingMixIn: - """Mix-in class to handle each request in a new thread.""" - - # Decides how threads will act upon termination of the - # main process - daemon_threads = False - - def process_request_thread(self, request, client_address): - """Same as in BaseServer but as a thread. - - In addition, exception handling is done here. - - """ - try: - self.finish_request(request, client_address) - self.shutdown_request(request) - except: - self.handle_error(request, client_address) - self.shutdown_request(request) - - def process_request(self, request, client_address): - """Start a new thread to process the request.""" - t = threading.Thread(target = self.process_request_thread, - args = (request, client_address)) - t.daemon = self.daemon_threads - t.start() - - -class ForkingUDPServer(ForkingMixIn, UDPServer): pass -class ForkingTCPServer(ForkingMixIn, TCPServer): pass - -class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass -class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass - -if hasattr(socket, 'AF_UNIX'): - - class UnixStreamServer(TCPServer): - address_family = socket.AF_UNIX - - class UnixDatagramServer(UDPServer): - address_family = socket.AF_UNIX - - class ThreadingUnixStreamServer(ThreadingMixIn, UnixStreamServer): pass - - class ThreadingUnixDatagramServer(ThreadingMixIn, UnixDatagramServer): pass - -class BaseRequestHandler: - - """Base class for request handler classes. - - This class is instantiated for each request to be handled. The - constructor sets the instance variables request, client_address - and server, and then calls the handle() method. To implement a - specific service, all you need to do is to derive a class which - defines a handle() method. - - The handle() method can find the request as self.request, the - client address as self.client_address, and the server (in case it - needs access to per-server information) as self.server. Since a - separate instance is created for each request, the handle() method - can define arbitrary other instance variariables. - - """ - - def __init__(self, request, client_address, server): - self.request = request - self.client_address = client_address - self.server = server - self.setup() - try: - self.handle() - finally: - self.finish() - - def setup(self): - pass - - def handle(self): - pass - - def finish(self): - pass - - -# The following two classes make it possible to use the same service -# class for stream or datagram servers. -# Each class sets up these instance variables: -# - rfile: a file object from which receives the request is read -# - wfile: a file object to which the reply is written -# When the handle() method returns, wfile is flushed properly - - -class StreamRequestHandler(BaseRequestHandler): - - """Define self.rfile and self.wfile for stream sockets.""" - - # Default buffer sizes for rfile, wfile. - # We default rfile to buffered because otherwise it could be - # really slow for large data (a getc() call per byte); we make - # wfile unbuffered because (a) often after a write() we want to - # read and we need to flush the line; (b) big writes to unbuffered - # files are typically optimized by stdio even when big reads - # aren't. - rbufsize = -1 - wbufsize = 0 - - # A timeout to apply to the request socket, if not None. - timeout = None - - # Disable nagle algorithm for this socket, if True. - # Use only when wbufsize != 0, to avoid small packets. - disable_nagle_algorithm = False - - def setup(self): - self.connection = self.request - if self.timeout is not None: - self.connection.settimeout(self.timeout) - if self.disable_nagle_algorithm: - self.connection.setsockopt(socket.IPPROTO_TCP, - socket.TCP_NODELAY, True) - self.rfile = self.connection.makefile('rb', self.rbufsize) - self.wfile = self.connection.makefile('wb', self.wbufsize) - - def finish(self): - if not self.wfile.closed: - self.wfile.flush() - self.wfile.close() - self.rfile.close() - - -class DatagramRequestHandler(BaseRequestHandler): - - # XXX Regrettably, I cannot get this working on Linux; - # s.recvfrom() doesn't return a meaningful client address. - - """Define self.rfile and self.wfile for datagram sockets.""" - - def setup(self): - try: - from cStringIO import StringIO - except ImportError: - from StringIO import StringIO - self.packet, self.socket = self.request - self.rfile = StringIO(self.packet) - self.wfile = StringIO() - - def finish(self): - self.socket.sendto(self.wfile.getvalue(), self.client_address) diff --git a/python/helpers/pydev/_pydev_imps/_pydev_Queue.py b/python/helpers/pydev/_pydev_imps/_pydev_Queue.py index d351b505a3e0..52e83b0de290 100644 --- a/python/helpers/pydev/_pydev_imps/_pydev_Queue.py +++ b/python/helpers/pydev/_pydev_imps/_pydev_Queue.py @@ -1,6 +1,7 @@ """A multi-producer, multi-consumer queue.""" from _pydev_imps._pydev_time import time as _time +from _pydev_imps import _pydev_thread try: import _pydev_threading as _threading except ImportError: @@ -30,7 +31,7 @@ class Queue: # that acquire mutex must release it before returning. mutex # is shared between the three conditions, so acquiring and # releasing the conditions also acquires and releases mutex. - self.mutex = _threading.Lock() + self.mutex = _pydev_thread.allocate_lock() # Notify not_empty whenever an item is added to the queue; a # thread waiting to get is notified then. self.not_empty = _threading.Condition(self.mutex) diff --git a/python/helpers/pydev/_pydev_imps/_pydev_select.py b/python/helpers/pydev/_pydev_imps/_pydev_select.py index b8dad03cc984..c031f3d8177f 100644 --- a/python/helpers/pydev/_pydev_imps/_pydev_select.py +++ b/python/helpers/pydev/_pydev_imps/_pydev_select.py @@ -1 +1,9 @@ -from select import * \ No newline at end of file +from select import * + +try: + from gevent import monkey + saved = monkey.saved['select'] + for key, val in saved.items(): + globals()[key] = val +except: + pass \ No newline at end of file diff --git a/python/helpers/pydev/_pydev_imps/_pydev_socket.py b/python/helpers/pydev/_pydev_imps/_pydev_socket.py index 9e96e800876c..3d74e3b54ab4 100644 --- a/python/helpers/pydev/_pydev_imps/_pydev_socket.py +++ b/python/helpers/pydev/_pydev_imps/_pydev_socket.py @@ -1 +1,9 @@ -from socket import * \ No newline at end of file +from socket import * + +try: + from gevent import monkey + saved = monkey.saved['socket'] + for key, val in saved.items(): + globals()[key] = val +except: + pass \ No newline at end of file diff --git a/python/helpers/pydev/_pydev_imps/_pydev_thread.py b/python/helpers/pydev/_pydev_imps/_pydev_thread.py index 4d2fd5d8cf91..7b46c8ed3f05 100644 --- a/python/helpers/pydev/_pydev_imps/_pydev_thread.py +++ b/python/helpers/pydev/_pydev_imps/_pydev_thread.py @@ -2,3 +2,11 @@ try: from thread import * except: from _thread import * #Py3k + +try: + from gevent import monkey + saved = monkey.saved['thread'] + for key, val in saved.items(): + globals()[key] = val +except: + pass diff --git a/python/helpers/pydev/_pydev_imps/_pydev_time.py b/python/helpers/pydev/_pydev_imps/_pydev_time.py index 72705db20bdc..f53b94c0d0ad 100644 --- a/python/helpers/pydev/_pydev_imps/_pydev_time.py +++ b/python/helpers/pydev/_pydev_imps/_pydev_time.py @@ -1 +1,9 @@ from time import * + +try: + from gevent import monkey + saved = monkey.saved['time'] + for key, val in saved.items(): + globals()[key] = val +except: + pass diff --git a/python/helpers/pydev/_pydev_inspect.py b/python/helpers/pydev/_pydev_inspect.py deleted file mode 100644 index 5fd33d876c1b..000000000000 --- a/python/helpers/pydev/_pydev_inspect.py +++ /dev/null @@ -1,788 +0,0 @@ -"""Get useful information from live Python objects. - -This module encapsulates the interface provided by the internal special -attributes (func_*, co_*, im_*, tb_*, etc.) in a friendlier fashion. -It also provides some help for examining source code and class layout. - -Here are some of the useful functions provided by this module: - - ismodule(), isclass(), ismethod(), isfunction(), istraceback(), - isframe(), iscode(), isbuiltin(), isroutine() - check object types - getmembers() - get members of an object that satisfy a given condition - - getfile(), getsourcefile(), getsource() - find an object's source code - getdoc(), getcomments() - get documentation on an object - getmodule() - determine the module that an object came from - getclasstree() - arrange classes so as to represent their hierarchy - - getargspec(), getargvalues() - get info about function arguments - formatargspec(), formatargvalues() - format an argument spec - getouterframes(), getinnerframes() - get info about frames - currentframe() - get the current stack frame - stack(), trace() - get info about frames on the stack or in a traceback -""" - -# This module is in the public domain. No warranties. - -__author__ = 'Ka-Ping Yee ' -__date__ = '1 Jan 2001' - -import sys, os, types, string, re, imp, tokenize - -# ----------------------------------------------------------- type-checking -def ismodule(object): - """Return true if the object is a module. - - Module objects provide these attributes: - __doc__ documentation string - __file__ filename (missing for built-in modules)""" - return isinstance(object, types.ModuleType) - -def isclass(object): - """Return true if the object is a class. - - Class objects provide these attributes: - __doc__ documentation string - __module__ name of module in which this class was defined""" - return isinstance(object, types.ClassType) or hasattr(object, '__bases__') - -def ismethod(object): - """Return true if the object is an instance method. - - Instance method objects provide these attributes: - __doc__ documentation string - __name__ name with which this method was defined - im_class class object in which this method belongs - im_func function object containing implementation of method - im_self instance to which this method is bound, or None""" - return isinstance(object, types.MethodType) - -def ismethoddescriptor(object): - """Return true if the object is a method descriptor. - - But not if ismethod() or isclass() or isfunction() are true. - - This is new in Python 2.2, and, for example, is true of int.__add__. - An object passing this test has a __get__ attribute but not a __set__ - attribute, but beyond that the set of attributes varies. __name__ is - usually sensible, and __doc__ often is. - - Methods implemented via descriptors that also pass one of the other - tests return false from the ismethoddescriptor() test, simply because - the other tests promise more -- you can, e.g., count on having the - im_func attribute (etc) when an object passes ismethod().""" - return (hasattr(object, "__get__") - and not hasattr(object, "__set__") # else it's a data descriptor - and not ismethod(object) # mutual exclusion - and not isfunction(object) - and not isclass(object)) - -def isfunction(object): - """Return true if the object is a user-defined function. - - Function objects provide these attributes: - __doc__ documentation string - __name__ name with which this function was defined - func_code code object containing compiled function bytecode - func_defaults tuple of any default values for arguments - func_doc (same as __doc__) - func_globals global namespace in which this function was defined - func_name (same as __name__)""" - return isinstance(object, types.FunctionType) - -def istraceback(object): - """Return true if the object is a traceback. - - Traceback objects provide these attributes: - tb_frame frame object at this level - tb_lasti index of last attempted instruction in bytecode - tb_lineno current line number in Python source code - tb_next next inner traceback object (called by this level)""" - return isinstance(object, types.TracebackType) - -def isframe(object): - """Return true if the object is a frame object. - - Frame objects provide these attributes: - f_back next outer frame object (this frame's caller) - f_builtins built-in namespace seen by this frame - f_code code object being executed in this frame - f_exc_traceback traceback if raised in this frame, or None - f_exc_type exception type if raised in this frame, or None - f_exc_value exception value if raised in this frame, or None - f_globals global namespace seen by this frame - f_lasti index of last attempted instruction in bytecode - f_lineno current line number in Python source code - f_locals local namespace seen by this frame - f_restricted 0 or 1 if frame is in restricted execution mode - f_trace tracing function for this frame, or None""" - return isinstance(object, types.FrameType) - -def iscode(object): - """Return true if the object is a code object. - - Code objects provide these attributes: - co_argcount number of arguments (not including * or ** args) - co_code string of raw compiled bytecode - co_consts tuple of constants used in the bytecode - co_filename name of file in which this code object was created - co_firstlineno number of first line in Python source code - co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg - co_lnotab encoded mapping of line numbers to bytecode indices - co_name name with which this code object was defined - co_names tuple of names of local variables - co_nlocals number of local variables - co_stacksize virtual machine stack space required - co_varnames tuple of names of arguments and local variables""" - return isinstance(object, types.CodeType) - -def isbuiltin(object): - """Return true if the object is a built-in function or method. - - Built-in functions and methods provide these attributes: - __doc__ documentation string - __name__ original name of this function or method - __self__ instance to which a method is bound, or None""" - return isinstance(object, types.BuiltinFunctionType) - -def isroutine(object): - """Return true if the object is any kind of function or method.""" - return (isbuiltin(object) - or isfunction(object) - or ismethod(object) - or ismethoddescriptor(object)) - -def getmembers(object, predicate=None): - """Return all members of an object as (name, value) pairs sorted by name. - Optionally, only return members that satisfy a given predicate.""" - results = [] - for key in dir(object): - value = getattr(object, key) - if not predicate or predicate(value): - results.append((key, value)) - results.sort() - return results - -def classify_class_attrs(cls): - """Return list of attribute-descriptor tuples. - - For each name in dir(cls), the return list contains a 4-tuple - with these elements: - - 0. The name (a string). - - 1. The kind of attribute this is, one of these strings: - 'class method' created via classmethod() - 'static method' created via staticmethod() - 'property' created via property() - 'method' any other flavor of method - 'data' not a method - - 2. The class which defined this attribute (a class). - - 3. The object as obtained directly from the defining class's - __dict__, not via getattr. This is especially important for - data attributes: C.data is just a data object, but - C.__dict__['data'] may be a data descriptor with additional - info, like a __doc__ string. - """ - - mro = getmro(cls) - names = dir(cls) - result = [] - for name in names: - # Get the object associated with the name. - # Getting an obj from the __dict__ sometimes reveals more than - # using getattr. Static and class methods are dramatic examples. - if name in cls.__dict__: - obj = cls.__dict__[name] - else: - obj = getattr(cls, name) - - # Figure out where it was defined. - homecls = getattr(obj, "__objclass__", None) - if homecls is None: - # search the dicts. - for base in mro: - if name in base.__dict__: - homecls = base - break - - # Get the object again, in order to get it from the defining - # __dict__ instead of via getattr (if possible). - if homecls is not None and name in homecls.__dict__: - obj = homecls.__dict__[name] - - # Also get the object via getattr. - obj_via_getattr = getattr(cls, name) - - # Classify the object. - if isinstance(obj, staticmethod): - kind = "static method" - elif isinstance(obj, classmethod): - kind = "class method" - elif isinstance(obj, property): - kind = "property" - elif (ismethod(obj_via_getattr) or - ismethoddescriptor(obj_via_getattr)): - kind = "method" - else: - kind = "data" - - result.append((name, kind, homecls, obj)) - - return result - -# ----------------------------------------------------------- class helpers -def _searchbases(cls, accum): - # Simulate the "classic class" search order. - if cls in accum: - return - accum.append(cls) - for base in cls.__bases__: - _searchbases(base, accum) - -def getmro(cls): - "Return tuple of base classes (including cls) in method resolution order." - if hasattr(cls, "__mro__"): - return cls.__mro__ - else: - result = [] - _searchbases(cls, result) - return tuple(result) - -# -------------------------------------------------- source code extraction -def indentsize(line): - """Return the indent size, in spaces, at the start of a line of text.""" - expline = string.expandtabs(line) - return len(expline) - len(string.lstrip(expline)) - -def getdoc(object): - """Get the documentation string for an object. - - All tabs are expanded to spaces. To clean up docstrings that are - indented to line up with blocks of code, any whitespace than can be - uniformly removed from the second line onwards is removed.""" - try: - doc = object.__doc__ - except AttributeError: - return None - if not isinstance(doc, (str, unicode)): - return None - try: - lines = string.split(string.expandtabs(doc), '\n') - except UnicodeError: - return None - else: - margin = None - for line in lines[1:]: - content = len(string.lstrip(line)) - if not content: continue - indent = len(line) - content - if margin is None: margin = indent - else: margin = min(margin, indent) - if margin is not None: - for i in range(1, len(lines)): lines[i] = lines[i][margin:] - return string.join(lines, '\n') - -def getfile(object): - """Work out which source or compiled file an object was defined in.""" - if ismodule(object): - if hasattr(object, '__file__'): - return object.__file__ - raise TypeError, 'arg is a built-in module' - if isclass(object): - object = sys.modules.get(object.__module__) - if hasattr(object, '__file__'): - return object.__file__ - raise TypeError, 'arg is a built-in class' - if ismethod(object): - object = object.im_func - if isfunction(object): - object = object.func_code - if istraceback(object): - object = object.tb_frame - if isframe(object): - object = object.f_code - if iscode(object): - return object.co_filename - raise TypeError, 'arg is not a module, class, method, ' \ - 'function, traceback, frame, or code object' - -def getmoduleinfo(path): - """Get the module name, suffix, mode, and module type for a given file.""" - filename = os.path.basename(path) - suffixes = map(lambda (suffix, mode, mtype): - (-len(suffix), suffix, mode, mtype), imp.get_suffixes()) - suffixes.sort() # try longest suffixes first, in case they overlap - for neglen, suffix, mode, mtype in suffixes: - if filename[neglen:] == suffix: - return filename[:neglen], suffix, mode, mtype - -def getmodulename(path): - """Return the module name for a given file, or None.""" - info = getmoduleinfo(path) - if info: return info[0] - -def getsourcefile(object): - """Return the Python source file an object was defined in, if it exists.""" - filename = getfile(object) - if string.lower(filename[-4:]) in ['.pyc', '.pyo']: - filename = filename[:-4] + '.py' - for suffix, mode, kind in imp.get_suffixes(): - if 'b' in mode and string.lower(filename[-len(suffix):]) == suffix: - # Looks like a binary file. We want to only return a text file. - return None - if os.path.exists(filename): - return filename - -def getabsfile(object): - """Return an absolute path to the source or compiled file for an object. - - The idea is for each object to have a unique origin, so this routine - normalizes the result as much as possible.""" - return os.path.normcase( - os.path.abspath(getsourcefile(object) or getfile(object))) - -modulesbyfile = {} - -def getmodule(object): - """Return the module an object was defined in, or None if not found.""" - if ismodule(object): - return object - if isclass(object): - return sys.modules.get(object.__module__) - try: - file = getabsfile(object) - except TypeError: - return None - if modulesbyfile.has_key(file): - return sys.modules[modulesbyfile[file]] - for module in sys.modules.values(): - if hasattr(module, '__file__'): - modulesbyfile[getabsfile(module)] = module.__name__ - if modulesbyfile.has_key(file): - return sys.modules[modulesbyfile[file]] - main = sys.modules['__main__'] - if hasattr(main, object.__name__): - mainobject = getattr(main, object.__name__) - if mainobject is object: - return main - builtin = sys.modules['__builtin__'] - if hasattr(builtin, object.__name__): - builtinobject = getattr(builtin, object.__name__) - if builtinobject is object: - return builtin - -def findsource(object): - """Return the entire source file and starting line number for an object. - - The argument may be a module, class, method, function, traceback, frame, - or code object. The source code is returned as a list of all the lines - in the file and the line number indexes a line in that list. An IOError - is raised if the source code cannot be retrieved.""" - try: - file = open(getsourcefile(object)) - except (TypeError, IOError): - raise IOError, 'could not get source code' - lines = file.readlines() - file.close() - - if ismodule(object): - return lines, 0 - - if isclass(object): - name = object.__name__ - pat = re.compile(r'^\s*class\s*' + name + r'\b') - for i in range(len(lines)): - if pat.match(lines[i]): return lines, i - else: raise IOError, 'could not find class definition' - - if ismethod(object): - object = object.im_func - if isfunction(object): - object = object.func_code - if istraceback(object): - object = object.tb_frame - if isframe(object): - object = object.f_code - if iscode(object): - if not hasattr(object, 'co_firstlineno'): - raise IOError, 'could not find function definition' - lnum = object.co_firstlineno - 1 - pat = re.compile(r'^(\s*def\s)|(.*\slambda(:|\s))') - while lnum > 0: - if pat.match(lines[lnum]): break - lnum = lnum - 1 - return lines, lnum - raise IOError, 'could not find code object' - -def getcomments(object): - """Get lines of comments immediately preceding an object's source code.""" - try: lines, lnum = findsource(object) - except IOError: return None - - if ismodule(object): - # Look for a comment block at the top of the file. - start = 0 - if lines and lines[0][:2] == '#!': start = 1 - while start < len(lines) and string.strip(lines[start]) in ['', '#']: - start = start + 1 - if start < len(lines) and lines[start][:1] == '#': - comments = [] - end = start - while end < len(lines) and lines[end][:1] == '#': - comments.append(string.expandtabs(lines[end])) - end = end + 1 - return string.join(comments, '') - - # Look for a preceding block of comments at the same indentation. - elif lnum > 0: - indent = indentsize(lines[lnum]) - end = lnum - 1 - if end >= 0 and string.lstrip(lines[end])[:1] == '#' and \ - indentsize(lines[end]) == indent: - comments = [string.lstrip(string.expandtabs(lines[end]))] - if end > 0: - end = end - 1 - comment = string.lstrip(string.expandtabs(lines[end])) - while comment[:1] == '#' and indentsize(lines[end]) == indent: - comments[:0] = [comment] - end = end - 1 - if end < 0: break - comment = string.lstrip(string.expandtabs(lines[end])) - while comments and string.strip(comments[0]) == '#': - comments[:1] = [] - while comments and string.strip(comments[-1]) == '#': - comments[-1:] = [] - return string.join(comments, '') - -class ListReader: - """Provide a readline() method to return lines from a list of strings.""" - def __init__(self, lines): - self.lines = lines - self.index = 0 - - def readline(self): - i = self.index - if i < len(self.lines): - self.index = i + 1 - return self.lines[i] - else: return '' - -class EndOfBlock(Exception): pass - -class BlockFinder: - """Provide a tokeneater() method to detect the end of a code block.""" - def __init__(self): - self.indent = 0 - self.started = 0 - self.last = 0 - - def tokeneater(self, type, token, (srow, scol), (erow, ecol), line): - if not self.started: - if type == tokenize.NAME: self.started = 1 - elif type == tokenize.NEWLINE: - self.last = srow - elif type == tokenize.INDENT: - self.indent = self.indent + 1 - elif type == tokenize.DEDENT: - self.indent = self.indent - 1 - if self.indent == 0: raise EndOfBlock, self.last - elif type == tokenize.NAME and scol == 0: - raise EndOfBlock, self.last - -def getblock(lines): - """Extract the block of code at the top of the given list of lines.""" - try: - tokenize.tokenize(ListReader(lines).readline, BlockFinder().tokeneater) - except EndOfBlock, eob: - return lines[:eob.args[0]] - # Fooling the indent/dedent logic implies a one-line definition - return lines[:1] - -def getsourcelines(object): - """Return a list of source lines and starting line number for an object. - - The argument may be a module, class, method, function, traceback, frame, - or code object. The source code is returned as a list of the lines - corresponding to the object and the line number indicates where in the - original source file the first line of code was found. An IOError is - raised if the source code cannot be retrieved.""" - lines, lnum = findsource(object) - - if ismodule(object): return lines, 0 - else: return getblock(lines[lnum:]), lnum + 1 - -def getsource(object): - """Return the text of the source code for an object. - - The argument may be a module, class, method, function, traceback, frame, - or code object. The source code is returned as a single string. An - IOError is raised if the source code cannot be retrieved.""" - lines, lnum = getsourcelines(object) - return string.join(lines, '') - -# --------------------------------------------------- class tree extraction -def walktree(classes, children, parent): - """Recursive helper function for getclasstree().""" - results = [] - classes.sort(lambda a, b: cmp(a.__name__, b.__name__)) - for c in classes: - results.append((c, c.__bases__)) - if children.has_key(c): - results.append(walktree(children[c], children, c)) - return results - -def getclasstree(classes, unique=0): - """Arrange the given list of classes into a hierarchy of nested lists. - - Where a nested list appears, it contains classes derived from the class - whose entry immediately precedes the list. Each entry is a 2-tuple - containing a class and a tuple of its base classes. If the 'unique' - argument is true, exactly one entry appears in the returned structure - for each class in the given list. Otherwise, classes using multiple - inheritance and their descendants will appear multiple times.""" - children = {} - roots = [] - for c in classes: - if c.__bases__: - for parent in c.__bases__: - if not children.has_key(parent): - children[parent] = [] - children[parent].append(c) - if unique and parent in classes: break - elif c not in roots: - roots.append(c) - for parent in children.keys(): - if parent not in classes: - roots.append(parent) - return walktree(roots, children, None) - -# ------------------------------------------------ argument list extraction -# These constants are from Python's compile.h. -CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 1, 2, 4, 8 - -def getargs(co): - """Get information about the arguments accepted by a code object. - - Three things are returned: (args, varargs, varkw), where 'args' is - a list of argument names (possibly containing nested lists), and - 'varargs' and 'varkw' are the names of the * and ** arguments or None.""" - if not iscode(co): raise TypeError, 'arg is not a code object' - - nargs = co.co_argcount - names = co.co_varnames - args = list(names[:nargs]) - step = 0 - - # The following acrobatics are for anonymous (tuple) arguments. - if not sys.platform.startswith('java'):#Jython doesn't have co_code - code = co.co_code - import dis - for i in range(nargs): - if args[i][:1] in ['', '.']: - stack, remain, count = [], [], [] - while step < len(code): - op = ord(code[step]) - step = step + 1 - if op >= dis.HAVE_ARGUMENT: - opname = dis.opname[op] - value = ord(code[step]) + ord(code[step + 1]) * 256 - step = step + 2 - if opname in ['UNPACK_TUPLE', 'UNPACK_SEQUENCE']: - remain.append(value) - count.append(value) - elif opname == 'STORE_FAST': - stack.append(names[value]) - remain[-1] = remain[-1] - 1 - while remain[-1] == 0: - remain.pop() - size = count.pop() - stack[-size:] = [stack[-size:]] - if not remain: break - remain[-1] = remain[-1] - 1 - if not remain: break - args[i] = stack[0] - - varargs = None - if co.co_flags & CO_VARARGS: - varargs = co.co_varnames[nargs] - nargs = nargs + 1 - varkw = None - if co.co_flags & CO_VARKEYWORDS: - varkw = co.co_varnames[nargs] - return args, varargs, varkw - -def getargspec(func): - """Get the names and default values of a function's arguments. - - A tuple of four things is returned: (args, varargs, varkw, defaults). - 'args' is a list of the argument names (it may contain nested lists). - 'varargs' and 'varkw' are the names of the * and ** arguments or None. - 'defaults' is an n-tuple of the default values of the last n arguments.""" - if ismethod(func): - func = func.im_func - if not isfunction(func): raise TypeError, 'arg is not a Python function' - args, varargs, varkw = getargs(func.func_code) - return args, varargs, varkw, func.func_defaults - -def getargvalues(frame): - """Get information about arguments passed into a particular frame. - - A tuple of four things is returned: (args, varargs, varkw, locals). - 'args' is a list of the argument names (it may contain nested lists). - 'varargs' and 'varkw' are the names of the * and ** arguments or None. - 'locals' is the locals dictionary of the given frame.""" - args, varargs, varkw = getargs(frame.f_code) - return args, varargs, varkw, frame.f_locals - -def joinseq(seq): - if len(seq) == 1: - return '(' + seq[0] + ',)' - else: - return '(' + string.join(seq, ', ') + ')' - -def strseq(object, convert, join=joinseq): - """Recursively walk a sequence, stringifying each element.""" - if type(object) in [types.ListType, types.TupleType]: - return join(map(lambda o, c=convert, j=join: strseq(o, c, j), object)) - else: - return convert(object) - -def formatargspec(args, varargs=None, varkw=None, defaults=None, - formatarg=str, - formatvarargs=lambda name: '*' + name, - formatvarkw=lambda name: '**' + name, - formatvalue=lambda value: '=' + repr(value), - join=joinseq): - """Format an argument spec from the 4 values returned by getargspec. - - The first four arguments are (args, varargs, varkw, defaults). The - other four arguments are the corresponding optional formatting functions - that are called to turn names and values into strings. The ninth - argument is an optional function to format the sequence of arguments.""" - specs = [] - if defaults: - firstdefault = len(args) - len(defaults) - for i in range(len(args)): - spec = strseq(args[i], formatarg, join) - if defaults and i >= firstdefault: - spec = spec + formatvalue(defaults[i - firstdefault]) - specs.append(spec) - if varargs: - specs.append(formatvarargs(varargs)) - if varkw: - specs.append(formatvarkw(varkw)) - return '(' + string.join(specs, ', ') + ')' - -def formatargvalues(args, varargs, varkw, locals, - formatarg=str, - formatvarargs=lambda name: '*' + name, - formatvarkw=lambda name: '**' + name, - formatvalue=lambda value: '=' + repr(value), - join=joinseq): - """Format an argument spec from the 4 values returned by getargvalues. - - The first four arguments are (args, varargs, varkw, locals). The - next four arguments are the corresponding optional formatting functions - that are called to turn names and values into strings. The ninth - argument is an optional function to format the sequence of arguments.""" - def convert(name, locals=locals, - formatarg=formatarg, formatvalue=formatvalue): - return formatarg(name) + formatvalue(locals[name]) - specs = [] - for i in range(len(args)): - specs.append(strseq(args[i], convert, join)) - if varargs: - specs.append(formatvarargs(varargs) + formatvalue(locals[varargs])) - if varkw: - specs.append(formatvarkw(varkw) + formatvalue(locals[varkw])) - return '(' + string.join(specs, ', ') + ')' - -# -------------------------------------------------- stack frame extraction -def getframeinfo(frame, context=1): - """Get information about a frame or traceback object. - - A tuple of five things is returned: the filename, the line number of - the current line, the function name, a list of lines of context from - the source code, and the index of the current line within that list. - The optional second argument specifies the number of lines of context - to return, which are centered around the current line.""" - raise NotImplementedError -# if istraceback(frame): -# frame = frame.tb_frame -# if not isframe(frame): -# raise TypeError, 'arg is not a frame or traceback object' -# -# filename = getsourcefile(frame) -# lineno = getlineno(frame) -# if context > 0: -# start = lineno - 1 - context//2 -# try: -# lines, lnum = findsource(frame) -# except IOError: -# lines = index = None -# else: -# start = max(start, 1) -# start = min(start, len(lines) - context) -# lines = lines[start:start+context] -# index = lineno - 1 - start -# else: -# lines = index = None -# -# return (filename, lineno, frame.f_code.co_name, lines, index) - -def getlineno(frame): - """Get the line number from a frame object, allowing for optimization.""" - # Written by Marc-Andr Lemburg; revised by Jim Hugunin and Fredrik Lundh. - lineno = frame.f_lineno - code = frame.f_code - if hasattr(code, 'co_lnotab'): - table = code.co_lnotab - lineno = code.co_firstlineno - addr = 0 - for i in range(0, len(table), 2): - addr = addr + ord(table[i]) - if addr > frame.f_lasti: break - lineno = lineno + ord(table[i + 1]) - return lineno - -def getouterframes(frame, context=1): - """Get a list of records for a frame and all higher (calling) frames. - - Each record contains a frame object, filename, line number, function - name, a list of lines of context, and index within the context.""" - framelist = [] - while frame: - framelist.append((frame,) + getframeinfo(frame, context)) - frame = frame.f_back - return framelist - -def getinnerframes(tb, context=1): - """Get a list of records for a traceback's frame and all lower frames. - - Each record contains a frame object, filename, line number, function - name, a list of lines of context, and index within the context.""" - framelist = [] - while tb: - framelist.append((tb.tb_frame,) + getframeinfo(tb, context)) - tb = tb.tb_next - return framelist - -def currentframe(): - """Return the frame object for the caller's stack frame.""" - try: - raise 'catch me' - except: - return sys.exc_traceback.tb_frame.f_back #@UndefinedVariable - -if hasattr(sys, '_getframe'): currentframe = sys._getframe - -def stack(context=1): - """Return a list of records for the stack above the caller's frame.""" - return getouterframes(currentframe().f_back, context) - -def trace(context=1): - """Return a list of records for the stack below the current exception.""" - return getinnerframes(sys.exc_traceback, context) #@UndefinedVariable diff --git a/python/helpers/pydev/_pydev_select.py b/python/helpers/pydev/_pydev_select.py deleted file mode 100644 index b8dad03cc984..000000000000 --- a/python/helpers/pydev/_pydev_select.py +++ /dev/null @@ -1 +0,0 @@ -from select import * \ No newline at end of file diff --git a/python/helpers/pydev/_pydev_socket.py b/python/helpers/pydev/_pydev_socket.py deleted file mode 100644 index 9e96e800876c..000000000000 --- a/python/helpers/pydev/_pydev_socket.py +++ /dev/null @@ -1 +0,0 @@ -from socket import * \ No newline at end of file diff --git a/python/helpers/pydev/_pydev_threading.py b/python/helpers/pydev/_pydev_threading.py index d7bfadf04308..5d59b2baeedc 100644 --- a/python/helpers/pydev/_pydev_threading.py +++ b/python/helpers/pydev/_pydev_threading.py @@ -1,978 +1,13 @@ -"""Thread module emulating a subset of Java's threading model.""" +try: + from threading import settrace +except: + pass -import sys as _sys - -from _pydev_imps import _pydev_thread as thread -import warnings - -from _pydev_imps._pydev_time import time as _time, sleep as _sleep -from traceback import format_exc as _format_exc - -# Note regarding PEP 8 compliant aliases -# This threading model was originally inspired by Java, and inherited -# the convention of camelCase function and method names from that -# language. While those names are not in any imminent danger of being -# deprecated, starting with Python 2.6, the module now provides a -# PEP 8 compliant alias for any such method name. -# Using the new PEP 8 compliant names also facilitates substitution -# with the multiprocessing module, which doesn't provide the old -# Java inspired names. - - -# Rename some stuff so "from threading import *" is safe -__all__ = ['activeCount', 'active_count', 'Condition', 'currentThread', - 'current_thread', 'enumerate', 'Event', - 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', - 'Timer', 'setprofile', 'settrace', 'local', 'stack_size'] - -_start_new_thread = thread.start_new_thread -_allocate_lock = thread.allocate_lock -_get_ident = thread.get_ident -ThreadError = thread.error -del thread - - -# sys.exc_clear is used to work around the fact that except blocks -# don't fully clear the exception until 3.0. -warnings.filterwarnings('ignore', category=DeprecationWarning, - module='threading', message='sys.exc_clear') - -# Debug support (adapted from ihooks.py). -# All the major classes here derive from _Verbose. We force that to -# be a new-style class so that all the major classes here are new-style. -# This helps debugging (type(instance) is more revealing for instances -# of new-style classes). - -_VERBOSE = False - -if __debug__: - - class _Verbose(object): - - def __init__(self, verbose=None): - if verbose is None: - verbose = _VERBOSE - self.__verbose = verbose - - def _note(self, format, *args): - if self.__verbose: - format = format % args - # Issue #4188: calling current_thread() can incur an infinite - # recursion if it has to create a DummyThread on the fly. - ident = _get_ident() - try: - name = _active[ident].name - except KeyError: - name = "" % ident - format = "%s: %s\n" % (name, format) - _sys.stderr.write(format) - -else: - # Disable this when using "python -O" - class _Verbose(object): - def __init__(self, verbose=None): - pass - def _note(self, *args): - pass - -# Support for profile and trace hooks - -_profile_hook = None -_trace_hook = None - -def setprofile(func): - global _profile_hook - _profile_hook = func - -def settrace(func): - global _trace_hook - _trace_hook = func - -# Synchronization classes - -Lock = _allocate_lock - -def RLock(*args, **kwargs): - return _RLock(*args, **kwargs) - -class _RLock(_Verbose): - - def __init__(self, verbose=None): - _Verbose.__init__(self, verbose) - self.__block = _allocate_lock() - self.__owner = None - self.__count = 0 - - def __repr__(self): - owner = self.__owner - try: - owner = _active[owner].name - except KeyError: - pass - return "<%s owner=%r count=%d>" % ( - self.__class__.__name__, owner, self.__count) - - def acquire(self, blocking=1): - me = _get_ident() - if self.__owner == me: - self.__count = self.__count + 1 - if __debug__: - self._note("%s.acquire(%s): recursive success", self, blocking) - return 1 - rc = self.__block.acquire(blocking) - if rc: - self.__owner = me - self.__count = 1 - if __debug__: - self._note("%s.acquire(%s): initial success", self, blocking) - else: - if __debug__: - self._note("%s.acquire(%s): failure", self, blocking) - return rc - - __enter__ = acquire - - def release(self): - if self.__owner != _get_ident(): - raise RuntimeError("cannot release un-acquired lock") - self.__count = count = self.__count - 1 - if not count: - self.__owner = None - self.__block.release() - if __debug__: - self._note("%s.release(): final release", self) - else: - if __debug__: - self._note("%s.release(): non-final release", self) - - def __exit__(self, t, v, tb): - self.release() - - # Internal methods used by condition variables - - def _acquire_restore(self, count_owner): - count, owner = count_owner - self.__block.acquire() - self.__count = count - self.__owner = owner - if __debug__: - self._note("%s._acquire_restore()", self) - - def _release_save(self): - if __debug__: - self._note("%s._release_save()", self) - count = self.__count - self.__count = 0 - owner = self.__owner - self.__owner = None - self.__block.release() - return (count, owner) - - def _is_owned(self): - return self.__owner == _get_ident() - - -def Condition(*args, **kwargs): - return _Condition(*args, **kwargs) - -class _Condition(_Verbose): - - def __init__(self, lock=None, verbose=None): - _Verbose.__init__(self, verbose) - if lock is None: - lock = RLock() - self.__lock = lock - # Export the lock's acquire() and release() methods - self.acquire = lock.acquire - self.release = lock.release - # If the lock defines _release_save() and/or _acquire_restore(), - # these override the default implementations (which just call - # release() and acquire() on the lock). Ditto for _is_owned(). - try: - self._release_save = lock._release_save - except AttributeError: - pass - try: - self._acquire_restore = lock._acquire_restore - except AttributeError: - pass - try: - self._is_owned = lock._is_owned - except AttributeError: - pass - self.__waiters = [] - - def __enter__(self): - return self.__lock.__enter__() - - def __exit__(self, *args): - return self.__lock.__exit__(*args) - - def __repr__(self): - return "" % (self.__lock, len(self.__waiters)) - - def _release_save(self): - self.__lock.release() # No state to save - - def _acquire_restore(self, x): - self.__lock.acquire() # Ignore saved state - - def _is_owned(self): - # Return True if lock is owned by current_thread. - # This method is called only if __lock doesn't have _is_owned(). - if self.__lock.acquire(0): - self.__lock.release() - return False - else: - return True - - def wait(self, timeout=None): - if not self._is_owned(): - raise RuntimeError("cannot wait on un-acquired lock") - waiter = _allocate_lock() - waiter.acquire() - self.__waiters.append(waiter) - saved_state = self._release_save() - try: # restore state no matter what (e.g., KeyboardInterrupt) - if timeout is None: - waiter.acquire() - if __debug__: - self._note("%s.wait(): got it", self) - else: - # Balancing act: We can't afford a pure busy loop, so we - # have to sleep; but if we sleep the whole timeout time, - # we'll be unresponsive. The scheme here sleeps very - # little at first, longer as time goes on, but never longer - # than 20 times per second (or the timeout time remaining). - endtime = _time() + timeout - delay = 0.0005 # 500 us -> initial delay of 1 ms - while True: - gotit = waiter.acquire(0) - if gotit: - break - remaining = endtime - _time() - if remaining <= 0: - break - delay = min(delay * 2, remaining, .05) - _sleep(delay) - if not gotit: - if __debug__: - self._note("%s.wait(%s): timed out", self, timeout) - try: - self.__waiters.remove(waiter) - except ValueError: - pass - else: - if __debug__: - self._note("%s.wait(%s): got it", self, timeout) - finally: - self._acquire_restore(saved_state) - - def notify(self, n=1): - if not self._is_owned(): - raise RuntimeError("cannot notify on un-acquired lock") - __waiters = self.__waiters - waiters = __waiters[:n] - if not waiters: - if __debug__: - self._note("%s.notify(): no waiters", self) - return - self._note("%s.notify(): notifying %d waiter%s", self, n, - n!=1 and "s" or "") - for waiter in waiters: - waiter.release() - try: - __waiters.remove(waiter) - except ValueError: - pass - - def notifyAll(self): - self.notify(len(self.__waiters)) - - notify_all = notifyAll - - -def Semaphore(*args, **kwargs): - return _Semaphore(*args, **kwargs) - -class _Semaphore(_Verbose): - - # After Tim Peters' semaphore class, but not quite the same (no maximum) - - def __init__(self, value=1, verbose=None): - if value < 0: - raise ValueError("semaphore initial value must be >= 0") - _Verbose.__init__(self, verbose) - self.__cond = Condition(Lock()) - self.__value = value - - def acquire(self, blocking=1): - rc = False - self.__cond.acquire() - while self.__value == 0: - if not blocking: - break - if __debug__: - self._note("%s.acquire(%s): blocked waiting, value=%s", - self, blocking, self.__value) - self.__cond.wait() - else: - self.__value = self.__value - 1 - if __debug__: - self._note("%s.acquire: success, value=%s", - self, self.__value) - rc = True - self.__cond.release() - return rc - - __enter__ = acquire - - def release(self): - self.__cond.acquire() - self.__value = self.__value + 1 - if __debug__: - self._note("%s.release: success, value=%s", - self, self.__value) - self.__cond.notify() - self.__cond.release() - - def __exit__(self, t, v, tb): - self.release() - - -def BoundedSemaphore(*args, **kwargs): - return _BoundedSemaphore(*args, **kwargs) - -class _BoundedSemaphore(_Semaphore): - """Semaphore that checks that # releases is <= # acquires""" - def __init__(self, value=1, verbose=None): - _Semaphore.__init__(self, value, verbose) - self._initial_value = value - - def release(self): - if self._Semaphore__value >= self._initial_value: - raise ValueError, "Semaphore released too many times" - return _Semaphore.release(self) - - -def Event(*args, **kwargs): - return _Event(*args, **kwargs) - -class _Event(_Verbose): - - # After Tim Peters' event class (without is_posted()) - - def __init__(self, verbose=None): - _Verbose.__init__(self, verbose) - self.__cond = Condition(Lock()) - self.__flag = False - - def _reset_internal_locks(self): - # private! called by Thread._reset_internal_locks by _after_fork() - self.__cond.__init__() - - def isSet(self): - return self.__flag - - is_set = isSet - - def set(self): - self.__cond.acquire() - try: - self.__flag = True - self.__cond.notify_all() - finally: - self.__cond.release() - - def clear(self): - self.__cond.acquire() - try: - self.__flag = False - finally: - self.__cond.release() - - def wait(self, timeout=None): - self.__cond.acquire() - try: - if not self.__flag: - self.__cond.wait(timeout) - return self.__flag - finally: - self.__cond.release() - -# Helper to generate new thread names -_counter = 0 -def _newname(template="Thread-%d"): - global _counter - _counter = _counter + 1 - return template % _counter - -# Active thread administration -_active_limbo_lock = _allocate_lock() -_active = {} # maps thread id to Thread object -_limbo = {} - - -# Main class for threads - -class Thread(_Verbose): - - __initialized = False - # Need to store a reference to sys.exc_info for printing - # out exceptions when a thread tries to use a global var. during interp. - # shutdown and thus raises an exception about trying to perform some - # operation on/with a NoneType - __exc_info = _sys.exc_info - # Keep sys.exc_clear too to clear the exception just before - # allowing .join() to return. - __exc_clear = _sys.exc_clear - - def __init__(self, group=None, target=None, name=None, - args=(), kwargs=None, verbose=None): - assert group is None, "group argument must be None for now" - _Verbose.__init__(self, verbose) - if kwargs is None: - kwargs = {} - self.__target = target - self.__name = str(name or _newname()) - self.__args = args - self.__kwargs = kwargs - self.__daemonic = self._set_daemon() - self.__ident = None - self.__started = Event() - self.__stopped = False - self.__block = Condition(Lock()) - self.__initialized = True - # sys.stderr is not stored in the class like - # sys.exc_info since it can be changed between instances - self.__stderr = _sys.stderr - - def _reset_internal_locks(self): - # private! Called by _after_fork() to reset our internal locks as - # they may be in an invalid state leading to a deadlock or crash. - if hasattr(self, '_Thread__block'): # DummyThread deletes self.__block - self.__block.__init__() - self.__started._reset_internal_locks() - - @property - def _block(self): - # used by a unittest - return self.__block - - def _set_daemon(self): - # Overridden in _MainThread and _DummyThread - return current_thread().daemon - - def __repr__(self): - assert self.__initialized, "Thread.__init__() was not called" - status = "initial" - if self.__started.is_set(): - status = "started" - if self.__stopped: - status = "stopped" - if self.__daemonic: - status += " daemon" - if self.__ident is not None: - status += " %s" % self.__ident - return "<%s(%s, %s)>" % (self.__class__.__name__, self.__name, status) - - def start(self): - if not self.__initialized: - raise RuntimeError("thread.__init__() not called") - if self.__started.is_set(): - raise RuntimeError("threads can only be started once") - if __debug__: - self._note("%s.start(): starting thread", self) - with _active_limbo_lock: - _limbo[self] = self - try: - _start_new_thread(self.__bootstrap, ()) - except Exception: - with _active_limbo_lock: - del _limbo[self] - raise - self.__started.wait() - - def run(self): - try: - if self.__target: - self.__target(*self.__args, **self.__kwargs) - finally: - # Avoid a refcycle if the thread is running a function with - # an argument that has a member that points to the thread. - del self.__target, self.__args, self.__kwargs - - def __bootstrap(self): - # Wrapper around the real bootstrap code that ignores - # exceptions during interpreter cleanup. Those typically - # happen when a daemon thread wakes up at an unfortunate - # moment, finds the world around it destroyed, and raises some - # random exception *** while trying to report the exception in - # __bootstrap_inner() below ***. Those random exceptions - # don't help anybody, and they confuse users, so we suppress - # them. We suppress them only when it appears that the world - # indeed has already been destroyed, so that exceptions in - # __bootstrap_inner() during normal business hours are properly - # reported. Also, we only suppress them for daemonic threads; - # if a non-daemonic encounters this, something else is wrong. - try: - self.__bootstrap_inner() - except: - if self.__daemonic and _sys is None: - return - raise - - def _set_ident(self): - self.__ident = _get_ident() - - def __bootstrap_inner(self): - try: - self._set_ident() - self.__started.set() - with _active_limbo_lock: - _active[self.__ident] = self - del _limbo[self] - if __debug__: - self._note("%s.__bootstrap(): thread started", self) - - if _trace_hook: - self._note("%s.__bootstrap(): registering trace hook", self) - _sys.settrace(_trace_hook) - if _profile_hook: - self._note("%s.__bootstrap(): registering profile hook", self) - _sys.setprofile(_profile_hook) - - try: - self.run() - except SystemExit: - if __debug__: - self._note("%s.__bootstrap(): raised SystemExit", self) - except: - if __debug__: - self._note("%s.__bootstrap(): unhandled exception", self) - # If sys.stderr is no more (most likely from interpreter - # shutdown) use self.__stderr. Otherwise still use sys (as in - # _sys) in case sys.stderr was redefined since the creation of - # self. - if _sys: - _sys.stderr.write("Exception in thread %s:\n%s\n" % - (self.name, _format_exc())) - else: - # Do the best job possible w/o a huge amt. of code to - # approximate a traceback (code ideas from - # Lib/traceback.py) - exc_type, exc_value, exc_tb = self.__exc_info() - try: - print>>self.__stderr, ( - "Exception in thread " + self.name + - " (most likely raised during interpreter shutdown):") - print>>self.__stderr, ( - "Traceback (most recent call last):") - while exc_tb: - print>>self.__stderr, ( - ' File "%s", line %s, in %s' % - (exc_tb.tb_frame.f_code.co_filename, - exc_tb.tb_lineno, - exc_tb.tb_frame.f_code.co_name)) - exc_tb = exc_tb.tb_next - print>>self.__stderr, ("%s: %s" % (exc_type, exc_value)) - # Make sure that exc_tb gets deleted since it is a memory - # hog; deleting everything else is just for thoroughness - finally: - del exc_type, exc_value, exc_tb - else: - if __debug__: - self._note("%s.__bootstrap(): normal return", self) - finally: - # Prevent a race in - # test_threading.test_no_refcycle_through_target when - # the exception keeps the target alive past when we - # assert that it's dead. - self.__exc_clear() - finally: - with _active_limbo_lock: - self.__stop() - try: - # We don't call self.__delete() because it also - # grabs _active_limbo_lock. - del _active[_get_ident()] - except: - pass - - def __stop(self): - self.__block.acquire() - self.__stopped = True - self.__block.notify_all() - self.__block.release() - - def __delete(self): - "Remove current thread from the dict of currently running threads." - - # Notes about running with dummy_thread: - # - # Must take care to not raise an exception if dummy_thread is being - # used (and thus this module is being used as an instance of - # dummy_threading). dummy_thread.get_ident() always returns -1 since - # there is only one thread if dummy_thread is being used. Thus - # len(_active) is always <= 1 here, and any Thread instance created - # overwrites the (if any) thread currently registered in _active. - # - # An instance of _MainThread is always created by 'threading'. This - # gets overwritten the instant an instance of Thread is created; both - # threads return -1 from dummy_thread.get_ident() and thus have the - # same key in the dict. So when the _MainThread instance created by - # 'threading' tries to clean itself up when atexit calls this method - # it gets a KeyError if another Thread instance was created. - # - # This all means that KeyError from trying to delete something from - # _active if dummy_threading is being used is a red herring. But - # since it isn't if dummy_threading is *not* being used then don't - # hide the exception. - - try: - with _active_limbo_lock: - del _active[_get_ident()] - # There must not be any python code between the previous line - # and after the lock is released. Otherwise a tracing function - # could try to acquire the lock again in the same thread, (in - # current_thread()), and would block. - except KeyError: - if 'dummy_threading' not in _sys.modules: - raise - - def join(self, timeout=None): - if not self.__initialized: - raise RuntimeError("Thread.__init__() not called") - if not self.__started.is_set(): - raise RuntimeError("cannot join thread before it is started") - if self is current_thread(): - raise RuntimeError("cannot join current thread") - - if __debug__: - if not self.__stopped: - self._note("%s.join(): waiting until thread stops", self) - self.__block.acquire() - try: - if timeout is None: - while not self.__stopped: - self.__block.wait() - if __debug__: - self._note("%s.join(): thread stopped", self) - else: - deadline = _time() + timeout - while not self.__stopped: - delay = deadline - _time() - if delay <= 0: - if __debug__: - self._note("%s.join(): timed out", self) - break - self.__block.wait(delay) - else: - if __debug__: - self._note("%s.join(): thread stopped", self) - finally: - self.__block.release() - - @property - def name(self): - assert self.__initialized, "Thread.__init__() not called" - return self.__name - - @name.setter - def name(self, name): - assert self.__initialized, "Thread.__init__() not called" - self.__name = str(name) - - @property - def ident(self): - assert self.__initialized, "Thread.__init__() not called" - return self.__ident - - def isAlive(self): - assert self.__initialized, "Thread.__init__() not called" - return self.__started.is_set() and not self.__stopped - - is_alive = isAlive - - @property - def daemon(self): - assert self.__initialized, "Thread.__init__() not called" - return self.__daemonic - - @daemon.setter - def daemon(self, daemonic): - if not self.__initialized: - raise RuntimeError("Thread.__init__() not called") - if self.__started.is_set(): - raise RuntimeError("cannot set daemon status of active thread"); - self.__daemonic = daemonic - - def isDaemon(self): - return self.daemon - - def setDaemon(self, daemonic): - self.daemon = daemonic - - def getName(self): - return self.name - - def setName(self, name): - self.name = name - -# The timer class was contributed by Itamar Shtull-Trauring - -def Timer(*args, **kwargs): - return _Timer(*args, **kwargs) - -class _Timer(Thread): - """Call a function after a specified number of seconds: - - t = Timer(30.0, f, args=[], kwargs={}) - t.start() - t.cancel() # stop the timer's action if it's still waiting - """ - - def __init__(self, interval, function, args=[], kwargs={}): - Thread.__init__(self) - self.interval = interval - self.function = function - self.args = args - self.kwargs = kwargs - self.finished = Event() - - def cancel(self): - """Stop the timer if it hasn't finished yet""" - self.finished.set() - - def run(self): - self.finished.wait(self.interval) - if not self.finished.is_set(): - self.function(*self.args, **self.kwargs) - self.finished.set() - -# Special thread class to represent the main thread -# This is garbage collected through an exit handler - -class _MainThread(Thread): - - def __init__(self): - Thread.__init__(self, name="MainThread") - self._Thread__started.set() - self._set_ident() - with _active_limbo_lock: - _active[_get_ident()] = self - - def _set_daemon(self): - return False - - def _exitfunc(self): - self._Thread__stop() - t = _pickSomeNonDaemonThread() - if t: - if __debug__: - self._note("%s: waiting for other threads", self) - while t: - t.join() - t = _pickSomeNonDaemonThread() - if __debug__: - self._note("%s: exiting", self) - self._Thread__delete() - -def _pickSomeNonDaemonThread(): - for t in enumerate(): - if not t.daemon and t.is_alive(): - return t - return None - - -# Dummy thread class to represent threads not started here. -# These aren't garbage collected when they die, nor can they be waited for. -# If they invoke anything in threading.py that calls current_thread(), they -# leave an entry in the _active dict forever after. -# Their purpose is to return *something* from current_thread(). -# They are marked as daemon threads so we won't wait for them -# when we exit (conform previous semantics). - -class _DummyThread(Thread): - - def __init__(self): - Thread.__init__(self, name=_newname("Dummy-%d")) - - # Thread.__block consumes an OS-level locking primitive, which - # can never be used by a _DummyThread. Since a _DummyThread - # instance is immortal, that's bad, so release this resource. - del self._Thread__block - - self._Thread__started.set() - self._set_ident() - with _active_limbo_lock: - _active[_get_ident()] = self - - def _set_daemon(self): - return True - - def join(self, timeout=None): - assert False, "cannot join a dummy thread" - - -# Global API functions - -def currentThread(): - try: - return _active[_get_ident()] - except KeyError: - ##print "current_thread(): no current thread for", _get_ident() - return _DummyThread() - -current_thread = currentThread - -def activeCount(): - with _active_limbo_lock: - return len(_active) + len(_limbo) - -active_count = activeCount - -def _enumerate(): - # Same as enumerate(), but without the lock. Internal use only. - return _active.values() + _limbo.values() - -def enumerate(): - with _active_limbo_lock: - return _active.values() + _limbo.values() - -# Create the main thread object, -# and make it available for the interpreter -# (Py_Main) as threading._shutdown. - -_shutdown = _MainThread()._exitfunc - -# get thread-local implementation, either from the thread -# module, or from the python fallback try: - from _pydev_imps._pydev_thread import _local as local -except ImportError: - from _threading_local import local - - -def _after_fork(): - # This function is called by Python/ceval.c:PyEval_ReInitThreads which - # is called from PyOS_AfterFork. Here we cleanup threading module state - # that should not exist after a fork. - - # Reset _active_limbo_lock, in case we forked while the lock was held - # by another (non-forked) thread. http://bugs.python.org/issue874900 - global _active_limbo_lock - _active_limbo_lock = _allocate_lock() - - # fork() only copied the current thread; clear references to others. - new_active = {} - current = current_thread() - with _active_limbo_lock: - for thread in _active.itervalues(): - # Any lock/condition variable may be currently locked or in an - # invalid state, so we reinitialize them. - if hasattr(thread, '_reset_internal_locks'): - thread._reset_internal_locks() - if thread is current: - # There is only one active thread. We reset the ident to - # its new value since it can have changed. - ident = _get_ident() - thread._Thread__ident = ident - new_active[ident] = thread - else: - # All the others are already stopped. - thread._Thread__stop() - - _limbo.clear() - _active.clear() - _active.update(new_active) - assert len(_active) == 1 - - -# Self-test code - -def _test(): - - class BoundedQueue(_Verbose): - - def __init__(self, limit): - _Verbose.__init__(self) - self.mon = RLock() - self.rc = Condition(self.mon) - self.wc = Condition(self.mon) - self.limit = limit - self.queue = deque() - - def put(self, item): - self.mon.acquire() - while len(self.queue) >= self.limit: - self._note("put(%s): queue full", item) - self.wc.wait() - self.queue.append(item) - self._note("put(%s): appended, length now %d", - item, len(self.queue)) - self.rc.notify() - self.mon.release() - - def get(self): - self.mon.acquire() - while not self.queue: - self._note("get(): queue empty") - self.rc.wait() - item = self.queue.popleft() - self._note("get(): got %s, %d left", item, len(self.queue)) - self.wc.notify() - self.mon.release() - return item - - class ProducerThread(Thread): - - def __init__(self, queue, quota): - Thread.__init__(self, name="Producer") - self.queue = queue - self.quota = quota - - def run(self): - from random import random - counter = 0 - while counter < self.quota: - counter = counter + 1 - self.queue.put("%s.%d" % (self.name, counter)) - _sleep(random() * 0.00001) - - - class ConsumerThread(Thread): - - def __init__(self, queue, count): - Thread.__init__(self, name="Consumer") - self.queue = queue - self.count = count - - def run(self): - while self.count > 0: - item = self.queue.get() - print item - self.count = self.count - 1 - - NP = 3 - QL = 4 - NI = 5 - - Q = BoundedQueue(QL) - P = [] - for i in range(NP): - t = ProducerThread(Q, NI) - t.name = ("Producer-%d" % (i+1)) - P.append(t) - C = ConsumerThread(Q, NI*NP) - for t in P: - t.start() - _sleep(0.000001) - C.start() - for t in P: - t.join() - C.join() - -if __name__ == '__main__': - _test() + from gevent import monkey + saved = monkey.saved['threading'] + for key, val in saved.items(): + globals()[key] = val +except: + pass diff --git a/python/helpers/pydev/_pydev_time.py b/python/helpers/pydev/_pydev_time.py deleted file mode 100644 index 72705db20bdc..000000000000 --- a/python/helpers/pydev/_pydev_time.py +++ /dev/null @@ -1 +0,0 @@ -from time import * diff --git a/python/helpers/pydev/_pydev_xmlrpclib.py b/python/helpers/pydev/_pydev_xmlrpclib.py deleted file mode 100644 index 5f6e2b7f138c..000000000000 --- a/python/helpers/pydev/_pydev_xmlrpclib.py +++ /dev/null @@ -1,1493 +0,0 @@ -#Just a copy of the version in python 2.5 to be used if it's not available in jython 2.1 -import sys - -# -# XML-RPC CLIENT LIBRARY -# -# an XML-RPC client interface for Python. -# -# the marshalling and response parser code can also be used to -# implement XML-RPC servers. -# -# Notes: -# this version is designed to work with Python 2.1 or newer. -# -# History: -# 1999-01-14 fl Created -# 1999-01-15 fl Changed dateTime to use localtime -# 1999-01-16 fl Added Binary/base64 element, default to RPC2 service -# 1999-01-19 fl Fixed array data element (from Skip Montanaro) -# 1999-01-21 fl Fixed dateTime constructor, etc. -# 1999-02-02 fl Added fault handling, handle empty sequences, etc. -# 1999-02-10 fl Fixed problem with empty responses (from Skip Montanaro) -# 1999-06-20 fl Speed improvements, pluggable parsers/transports (0.9.8) -# 2000-11-28 fl Changed boolean to check the truth value of its argument -# 2001-02-24 fl Added encoding/Unicode/SafeTransport patches -# 2001-02-26 fl Added compare support to wrappers (0.9.9/1.0b1) -# 2001-03-28 fl Make sure response tuple is a singleton -# 2001-03-29 fl Don't require empty params element (from Nicholas Riley) -# 2001-06-10 fl Folded in _xmlrpclib accelerator support (1.0b2) -# 2001-08-20 fl Base xmlrpclib.Error on built-in Exception (from Paul Prescod) -# 2001-09-03 fl Allow Transport subclass to override getparser -# 2001-09-10 fl Lazy import of urllib, cgi, xmllib (20x import speedup) -# 2001-10-01 fl Remove containers from memo cache when done with them -# 2001-10-01 fl Use faster escape method (80% dumps speedup) -# 2001-10-02 fl More dumps microtuning -# 2001-10-04 fl Make sure import expat gets a parser (from Guido van Rossum) -# 2001-10-10 sm Allow long ints to be passed as ints if they don't overflow -# 2001-10-17 sm Test for int and long overflow (allows use on 64-bit systems) -# 2001-11-12 fl Use repr() to marshal doubles (from Paul Felix) -# 2002-03-17 fl Avoid buffered read when possible (from James Rucker) -# 2002-04-07 fl Added pythondoc comments -# 2002-04-16 fl Added __str__ methods to datetime/binary wrappers -# 2002-05-15 fl Added error constants (from Andrew Kuchling) -# 2002-06-27 fl Merged with Python CVS version -# 2002-10-22 fl Added basic authentication (based on code from Phillip Eby) -# 2003-01-22 sm Add support for the bool type -# 2003-02-27 gvr Remove apply calls -# 2003-04-24 sm Use cStringIO if available -# 2003-04-25 ak Add support for nil -# 2003-06-15 gn Add support for time.struct_time -# 2003-07-12 gp Correct marshalling of Faults -# 2003-10-31 mvl Add multicall support -# 2004-08-20 mvl Bump minimum supported Python version to 2.1 -# -# Copyright (c) 1999-2002 by Secret Labs AB. -# Copyright (c) 1999-2002 by Fredrik Lundh. -# -# info@pythonware.com -# http://www.pythonware.com -# -# -------------------------------------------------------------------- -# The XML-RPC client interface is -# -# Copyright (c) 1999-2002 by Secret Labs AB -# Copyright (c) 1999-2002 by Fredrik Lundh -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# Secret Labs AB or the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR -# BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY -# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS -# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE -# OF THIS SOFTWARE. -# -------------------------------------------------------------------- - -# -# things to look into some day: - -# TODO: sort out True/False/boolean issues for Python 2.3 - -""" -An XML-RPC client interface for Python. - -The marshalling and response parser code can also be used to -implement XML-RPC servers. - -Exported exceptions: - - Error Base class for client errors - ProtocolError Indicates an HTTP protocol error - ResponseError Indicates a broken response package - Fault Indicates an XML-RPC fault package - -Exported classes: - - ServerProxy Represents a logical connection to an XML-RPC server - - MultiCall Executor of boxcared xmlrpc requests - Boolean boolean wrapper to generate a "boolean" XML-RPC value - DateTime dateTime wrapper for an ISO 8601 string or time tuple or - localtime integer value to generate a "dateTime.iso8601" - XML-RPC value - Binary binary data wrapper - - SlowParser Slow but safe standard parser (based on xmllib) - Marshaller Generate an XML-RPC params chunk from a Python data structure - Unmarshaller Unmarshal an XML-RPC response from incoming XML event message - Transport Handles an HTTP transaction to an XML-RPC server - SafeTransport Handles an HTTPS transaction to an XML-RPC server - -Exported constants: - - True - False - -Exported functions: - - boolean Convert any Python value to an XML-RPC boolean - getparser Create instance of the fastest available parser & attach - to an unmarshalling object - dumps Convert an argument tuple or a Fault instance to an XML-RPC - request (or response, if the methodresponse option is used). - loads Convert an XML-RPC packet to unmarshalled data plus a method - name (None if not present). -""" - -import re, string, time, operator - -from types import * - -# -------------------------------------------------------------------- -# Internal stuff - -try: - unicode -except NameError: - unicode = None # unicode support not available - -try: - import datetime -except ImportError: - datetime = None - -try: - _bool_is_builtin = False.__class__.__name__ == "bool" -except (NameError, AttributeError): - _bool_is_builtin = 0 - -def _decode(data, encoding, is8bit=re.compile("[\x80-\xff]").search): - # decode non-ascii string (if possible) - if unicode and encoding and is8bit(data): - data = unicode(data, encoding) - return data - -def escape(s, replace=string.replace): - s = replace(s, "&", "&") - s = replace(s, "<", "<") - return replace(s, ">", ">",) - -if unicode: - def _stringify(string): - # convert to 7-bit ascii if possible - try: - return string.encode("ascii") - except UnicodeError: - return string -else: - def _stringify(string): - return string - -__version__ = "1.0.1" - -# xmlrpc integer limits -try: - long -except NameError: - long = int -MAXINT = long(2) ** 31 - 1 -MININT = long(-2) ** 31 - -# -------------------------------------------------------------------- -# Error constants (from Dan Libby's specification at -# http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php) - -# Ranges of errors -PARSE_ERROR = -32700 -SERVER_ERROR = -32600 -APPLICATION_ERROR = -32500 -SYSTEM_ERROR = -32400 -TRANSPORT_ERROR = -32300 - -# Specific errors -NOT_WELLFORMED_ERROR = -32700 -UNSUPPORTED_ENCODING = -32701 -INVALID_ENCODING_CHAR = -32702 -INVALID_XMLRPC = -32600 -METHOD_NOT_FOUND = -32601 -INVALID_METHOD_PARAMS = -32602 -INTERNAL_ERROR = -32603 - -# -------------------------------------------------------------------- -# Exceptions - -## -# Base class for all kinds of client-side errors. - -class Error(Exception): - """Base class for client errors.""" - def __str__(self): - return repr(self) - -## -# Indicates an HTTP-level protocol error. This is raised by the HTTP -# transport layer, if the server returns an error code other than 200 -# (OK). -# -# @param url The target URL. -# @param errcode The HTTP error code. -# @param errmsg The HTTP error message. -# @param headers The HTTP header dictionary. - -class ProtocolError(Error): - """Indicates an HTTP protocol error.""" - def __init__(self, url, errcode, errmsg, headers): - Error.__init__(self) - self.url = url - self.errcode = errcode - self.errmsg = errmsg - self.headers = headers - def __repr__(self): - return ( - "" % - (self.url, self.errcode, self.errmsg) - ) - -## -# Indicates a broken XML-RPC response package. This exception is -# raised by the unmarshalling layer, if the XML-RPC response is -# malformed. - -class ResponseError(Error): - """Indicates a broken response package.""" - pass - -## -# Indicates an XML-RPC fault response package. This exception is -# raised by the unmarshalling layer, if the XML-RPC response contains -# a fault string. This exception can also used as a class, to -# generate a fault XML-RPC message. -# -# @param faultCode The XML-RPC fault code. -# @param faultString The XML-RPC fault string. - -class Fault(Error): - """Indicates an XML-RPC fault package.""" - def __init__(self, faultCode, faultString, **extra): - Error.__init__(self) - self.faultCode = faultCode - self.faultString = faultString - def __repr__(self): - return ( - "" % - (self.faultCode, repr(self.faultString)) - ) - -# -------------------------------------------------------------------- -# Special values - -## -# Wrapper for XML-RPC boolean values. Use the xmlrpclib.True and -# xmlrpclib.False constants, or the xmlrpclib.boolean() function, to -# generate boolean XML-RPC values. -# -# @param value A boolean value. Any true value is interpreted as True, -# all other values are interpreted as False. - -if _bool_is_builtin: - boolean = Boolean = bool #@UndefinedVariable - # to avoid breaking code which references xmlrpclib.{True,False} - True, False = True, False -else: - class Boolean: - """Boolean-value wrapper. - - Use True or False to generate a "boolean" XML-RPC value. - """ - - def __init__(self, value=0): - self.value = operator.truth(value) - - def encode(self, out): - out.write("%d\n" % self.value) - - def __cmp__(self, other): - if isinstance(other, Boolean): - other = other.value - return cmp(self.value, other) - - def __repr__(self): - if self.value: - return "" % id(self) - else: - return "" % id(self) - - def __int__(self): - return self.value - - def __nonzero__(self): - return self.value - - True, False = Boolean(1), Boolean(0) - - ## - # Map true or false value to XML-RPC boolean values. - # - # @def boolean(value) - # @param value A boolean value. Any true value is mapped to True, - # all other values are mapped to False. - # @return xmlrpclib.True or xmlrpclib.False. - # @see Boolean - # @see True - # @see False - - def boolean(value, _truefalse=(False, True)): - """Convert any Python value to XML-RPC 'boolean'.""" - return _truefalse[operator.truth(value)] - -## -# Wrapper for XML-RPC DateTime values. This converts a time value to -# the format used by XML-RPC. -#

-# The value can be given as a string in the format -# "yyyymmddThh:mm:ss", as a 9-item time tuple (as returned by -# time.localtime()), or an integer value (as returned by time.time()). -# The wrapper uses time.localtime() to convert an integer to a time -# tuple. -# -# @param value The time, given as an ISO 8601 string, a time -# tuple, or a integer time value. - -class DateTime: - """DateTime wrapper for an ISO 8601 string or time tuple or - localtime integer value to generate 'dateTime.iso8601' XML-RPC - value. - """ - - def __init__(self, value=0): - if not isinstance(value, StringType): - if datetime and isinstance(value, datetime.datetime): - self.value = value.strftime("%Y%m%dT%H:%M:%S") - return - if datetime and isinstance(value, datetime.date): - self.value = value.strftime("%Y%m%dT%H:%M:%S") - return - if datetime and isinstance(value, datetime.time): - today = datetime.datetime.now().strftime("%Y%m%d") - self.value = value.strftime(today + "T%H:%M:%S") - return - if not isinstance(value, (TupleType, time.struct_time)): #@UndefinedVariable - if value == 0: - value = time.time() - value = time.localtime(value) - value = time.strftime("%Y%m%dT%H:%M:%S", value) - self.value = value - - def __cmp__(self, other): - if isinstance(other, DateTime): - other = other.value - return cmp(self.value, other) - - ## - # Get date/time value. - # - # @return Date/time value, as an ISO 8601 string. - - def __str__(self): - return self.value - - def __repr__(self): - return "" % (repr(self.value), id(self)) - - def decode(self, data): - data = str(data) - self.value = string.strip(data) - - def encode(self, out): - out.write("") - out.write(self.value) - out.write("\n") - -def _datetime(data): - # decode xml element contents into a DateTime structure. - value = DateTime() - value.decode(data) - return value - -def _datetime_type(data): - t = time.strptime(data, "%Y%m%dT%H:%M:%S") #@UndefinedVariable - return datetime.datetime(*tuple(t)[:6]) - -## -# Wrapper for binary data. This can be used to transport any kind -# of binary data over XML-RPC, using BASE64 encoding. -# -# @param data An 8-bit string containing arbitrary data. - -import base64 -try: - import cStringIO as StringIO -except ImportError: - import StringIO - -class Binary: - """Wrapper for binary data.""" - - def __init__(self, data=None): - self.data = data - - ## - # Get buffer contents. - # - # @return Buffer contents, as an 8-bit string. - - def __str__(self): - return self.data or "" - - def __cmp__(self, other): - if isinstance(other, Binary): - other = other.data - return cmp(self.data, other) - - def decode(self, data): - self.data = base64.decodestring(data) - - def encode(self, out): - out.write("\n") - base64.encode(StringIO.StringIO(self.data), out) - out.write("\n") - -def _binary(data): - # decode xml element contents into a Binary structure - value = Binary() - value.decode(data) - return value - -WRAPPERS = (DateTime, Binary) -if not _bool_is_builtin: - WRAPPERS = WRAPPERS + (Boolean,) - -# -------------------------------------------------------------------- -# XML parsers - -try: - # optional xmlrpclib accelerator - import _xmlrpclib #@UnresolvedImport - FastParser = _xmlrpclib.Parser - FastUnmarshaller = _xmlrpclib.Unmarshaller -except (AttributeError, ImportError): - FastParser = FastUnmarshaller = None - -try: - import _xmlrpclib #@UnresolvedImport - FastMarshaller = _xmlrpclib.Marshaller -except (AttributeError, ImportError): - FastMarshaller = None - -# -# the SGMLOP parser is about 15x faster than Python's builtin -# XML parser. SGMLOP sources can be downloaded from: -# -# http://www.pythonware.com/products/xml/sgmlop.htm -# - -try: - import sgmlop - if not hasattr(sgmlop, "XMLParser"): - raise ImportError() -except ImportError: - SgmlopParser = None # sgmlop accelerator not available -else: - class SgmlopParser: - def __init__(self, target): - - # setup callbacks - self.finish_starttag = target.start - self.finish_endtag = target.end - self.handle_data = target.data - self.handle_xml = target.xml - - # activate parser - self.parser = sgmlop.XMLParser() - self.parser.register(self) - self.feed = self.parser.feed - self.entity = { - "amp": "&", "gt": ">", "lt": "<", - "apos": "'", "quot": '"' - } - - def close(self): - try: - self.parser.close() - finally: - self.parser = self.feed = None # nuke circular reference - - def handle_proc(self, tag, attr): - m = re.search("encoding\s*=\s*['\"]([^\"']+)[\"']", attr) #@UndefinedVariable - if m: - self.handle_xml(m.group(1), 1) - - def handle_entityref(self, entity): - # entity - try: - self.handle_data(self.entity[entity]) - except KeyError: - self.handle_data("&%s;" % entity) - -try: - from xml.parsers import expat - if not hasattr(expat, "ParserCreate"): - raise ImportError() -except ImportError: - ExpatParser = None # expat not available -else: - class ExpatParser: - # fast expat parser for Python 2.0 and later. this is about - # 50% slower than sgmlop, on roundtrip testing - def __init__(self, target): - self._parser = parser = expat.ParserCreate(None, None) - self._target = target - parser.StartElementHandler = target.start - parser.EndElementHandler = target.end - parser.CharacterDataHandler = target.data - encoding = None - if not parser.returns_unicode: - encoding = "utf-8" - target.xml(encoding, None) - - def feed(self, data): - self._parser.Parse(data, 0) - - def close(self): - self._parser.Parse("", 1) # end of data - del self._target, self._parser # get rid of circular references - -class SlowParser: - """Default XML parser (based on xmllib.XMLParser).""" - # this is about 10 times slower than sgmlop, on roundtrip - # testing. - def __init__(self, target): - import xmllib # lazy subclassing (!) - if xmllib.XMLParser not in SlowParser.__bases__: - SlowParser.__bases__ = (xmllib.XMLParser,) - self.handle_xml = target.xml - self.unknown_starttag = target.start - self.handle_data = target.data - self.handle_cdata = target.data - self.unknown_endtag = target.end - try: - xmllib.XMLParser.__init__(self, accept_utf8=1) - except TypeError: - xmllib.XMLParser.__init__(self) # pre-2.0 - -# -------------------------------------------------------------------- -# XML-RPC marshalling and unmarshalling code - -## -# XML-RPC marshaller. -# -# @param encoding Default encoding for 8-bit strings. The default -# value is None (interpreted as UTF-8). -# @see dumps - -class Marshaller: - """Generate an XML-RPC params chunk from a Python data structure. - - Create a Marshaller instance for each set of parameters, and use - the "dumps" method to convert your data (represented as a tuple) - to an XML-RPC params chunk. To write a fault response, pass a - Fault instance instead. You may prefer to use the "dumps" module - function for this purpose. - """ - - # by the way, if you don't understand what's going on in here, - # that's perfectly ok. - - def __init__(self, encoding=None, allow_none=0): - self.memo = {} - self.data = None - self.encoding = encoding - self.allow_none = allow_none - - dispatch = {} - - def dumps(self, values): - out = [] - write = out.append - dump = self.__dump - if isinstance(values, Fault): - # fault instance - write("\n") - dump({'faultCode': values.faultCode, - 'faultString': values.faultString}, - write) - write("\n") - else: - # parameter block - # FIXME: the xml-rpc specification allows us to leave out - # the entire block if there are no parameters. - # however, changing this may break older code (including - # old versions of xmlrpclib.py), so this is better left as - # is for now. See @XMLRPC3 for more information. /F - write("\n") - for v in values: - write("\n") - dump(v, write) - write("\n") - write("\n") - result = string.join(out, "") - return result - - def __dump(self, value, write): - try: - f = self.dispatch[type(value)] - except KeyError: - raise TypeError("cannot marshal %s objects" % type(value)) - else: - f(self, value, write) - - def dump_nil (self, value, write): - if not self.allow_none: - raise TypeError("cannot marshal None unless allow_none is enabled") - write("") - dispatch[NoneType] = dump_nil - - def dump_int(self, value, write): - # in case ints are > 32 bits - if value > MAXINT or value < MININT: - raise OverflowError("int exceeds XML-RPC limits") - write("") - write(str(value)) - write("\n") - dispatch[IntType] = dump_int - - if _bool_is_builtin: - def dump_bool(self, value, write): - write("") - write(value and "1" or "0") - write("\n") - dispatch[bool] = dump_bool #@UndefinedVariable - - def dump_long(self, value, write): - if value > MAXINT or value < MININT: - raise OverflowError("long int exceeds XML-RPC limits") - write("") - write(str(int(value))) - write("\n") - dispatch[LongType] = dump_long - - def dump_double(self, value, write): - write("") - write(repr(value)) - write("\n") - dispatch[FloatType] = dump_double - - def dump_string(self, value, write, escape=escape): - write("") - write(escape(value)) - write("\n") - dispatch[StringType] = dump_string - - if unicode: - def dump_unicode(self, value, write, escape=escape): - value = value.encode(self.encoding) - write("") - write(escape(value)) - write("\n") - dispatch[UnicodeType] = dump_unicode - - def dump_array(self, value, write): - i = id(value) - if self.memo.has_key(i): - raise TypeError("cannot marshal recursive sequences") - self.memo[i] = None - dump = self.__dump - write("\n") - for v in value: - dump(v, write) - write("\n") - del self.memo[i] - dispatch[TupleType] = dump_array - dispatch[ListType] = dump_array - - def dump_struct(self, value, write, escape=escape): - i = id(value) - if self.memo.has_key(i): - raise TypeError("cannot marshal recursive dictionaries") - self.memo[i] = None - dump = self.__dump - write("\n") - for k, v in value.items(): - write("\n") - if type(k) is not StringType: - if unicode and type(k) is UnicodeType: - k = k.encode(self.encoding) - else: - raise TypeError("dictionary key must be string") - write("%s\n" % escape(k)) - dump(v, write) - write("\n") - write("\n") - del self.memo[i] - dispatch[DictType] = dump_struct - - if datetime: - def dump_datetime(self, value, write): - write("") - write(value.strftime("%Y%m%dT%H:%M:%S")) - write("\n") - dispatch[datetime.datetime] = dump_datetime - - def dump_date(self, value, write): - write("") - write(value.strftime("%Y%m%dT00:00:00")) - write("\n") - dispatch[datetime.date] = dump_date - - def dump_time(self, value, write): - write("") - write(datetime.datetime.now().date().strftime("%Y%m%dT")) - write(value.strftime("%H:%M:%S")) - write("\n") - dispatch[datetime.time] = dump_time - - def dump_instance(self, value, write): - # check for special wrappers - if value.__class__ in WRAPPERS: - self.write = write - value.encode(self) - del self.write - else: - # store instance attributes as a struct (really?) - self.dump_struct(value.__dict__, write) - dispatch[InstanceType] = dump_instance - -## -# XML-RPC unmarshaller. -# -# @see loads - -class Unmarshaller: - """Unmarshal an XML-RPC response, based on incoming XML event - messages (start, data, end). Call close() to get the resulting - data structure. - - Note that this reader is fairly tolerant, and gladly accepts bogus - XML-RPC data without complaining (but not bogus XML). - """ - - # and again, if you don't understand what's going on in here, - # that's perfectly ok. - - def __init__(self, use_datetime=0): - self._type = None - self._stack = [] - self._marks = [] - self._data = [] - self._methodname = None - self._encoding = "utf-8" - self.append = self._stack.append - self._use_datetime = use_datetime - if use_datetime and not datetime: - raise ValueError("the datetime module is not available") - - def close(self): - # return response tuple and target method - if self._type is None or self._marks: - raise ResponseError() - if self._type == "fault": - raise Fault(**self._stack[0]) - return tuple(self._stack) - - def getmethodname(self): - return self._methodname - - # - # event handlers - - def xml(self, encoding, standalone): - self._encoding = encoding - # FIXME: assert standalone == 1 ??? - - def start(self, tag, attrs): - # prepare to handle this element - if tag == "array" or tag == "struct": - self._marks.append(len(self._stack)) - self._data = [] - self._value = (tag == "value") - - def data(self, text): - self._data.append(text) - - def end(self, tag, join=string.join): - # call the appropriate end tag handler - try: - f = self.dispatch[tag] - except KeyError: - pass # unknown tag ? - else: - return f(self, join(self._data, "")) - - # - # accelerator support - - def end_dispatch(self, tag, data): - # dispatch data - try: - f = self.dispatch[tag] - except KeyError: - pass # unknown tag ? - else: - return f(self, data) - - # - # element decoders - - dispatch = {} - - def end_nil (self, data): - self.append(None) - self._value = 0 - dispatch["nil"] = end_nil - - def end_boolean(self, data): - if data == "0": - self.append(False) - elif data == "1": - self.append(True) - else: - raise TypeError("bad boolean value") - self._value = 0 - dispatch["boolean"] = end_boolean - - def end_int(self, data): - self.append(int(data)) - self._value = 0 - dispatch["i4"] = end_int - dispatch["int"] = end_int - - def end_double(self, data): - self.append(float(data)) - self._value = 0 - dispatch["double"] = end_double - - def end_string(self, data): - if self._encoding: - data = _decode(data, self._encoding) - self.append(_stringify(data)) - self._value = 0 - dispatch["string"] = end_string - dispatch["name"] = end_string # struct keys are always strings - - def end_array(self, data): - mark = self._marks.pop() - # map arrays to Python lists - self._stack[mark:] = [self._stack[mark:]] - self._value = 0 - dispatch["array"] = end_array - - def end_struct(self, data): - mark = self._marks.pop() - # map structs to Python dictionaries - dict = {} - items = self._stack[mark:] - for i in range(0, len(items), 2): - dict[_stringify(items[i])] = items[i + 1] - self._stack[mark:] = [dict] - self._value = 0 - dispatch["struct"] = end_struct - - def end_base64(self, data): - value = Binary() - value.decode(data) - self.append(value) - self._value = 0 - dispatch["base64"] = end_base64 - - def end_dateTime(self, data): - value = DateTime() - value.decode(data) - if self._use_datetime: - value = _datetime_type(data) - self.append(value) - dispatch["dateTime.iso8601"] = end_dateTime - - def end_value(self, data): - # if we stumble upon a value element with no internal - # elements, treat it as a string element - if self._value: - self.end_string(data) - dispatch["value"] = end_value - - def end_params(self, data): - self._type = "params" - dispatch["params"] = end_params - - def end_fault(self, data): - self._type = "fault" - dispatch["fault"] = end_fault - - def end_methodName(self, data): - if self._encoding: - data = _decode(data, self._encoding) - self._methodname = data - self._type = "methodName" # no params - dispatch["methodName"] = end_methodName - -## Multicall support -# - -class _MultiCallMethod: - # some lesser magic to store calls made to a MultiCall object - # for batch execution - def __init__(self, call_list, name): - self.__call_list = call_list - self.__name = name - def __getattr__(self, name): - return _MultiCallMethod(self.__call_list, "%s.%s" % (self.__name, name)) - def __call__(self, *args): - self.__call_list.append((self.__name, args)) - -class MultiCallIterator: - """Iterates over the results of a multicall. Exceptions are - thrown in response to xmlrpc faults.""" - - def __init__(self, results): - self.results = results - - def __getitem__(self, i): - item = self.results[i] - if type(item) == type({}): - raise Fault(item['faultCode'], item['faultString']) - elif type(item) == type([]): - return item[0] - else: - raise ValueError("unexpected type in multicall result") - -class MultiCall: - """server -> a object used to boxcar method calls - - server should be a ServerProxy object. - - Methods can be added to the MultiCall using normal - method call syntax e.g.: - - multicall = MultiCall(server_proxy) - multicall.add(2,3) - multicall.get_address("Guido") - - To execute the multicall, call the MultiCall object e.g.: - - add_result, address = multicall() - """ - - def __init__(self, server): - self.__server = server - self.__call_list = [] - - def __repr__(self): - return "" % id(self) - - __str__ = __repr__ - - def __getattr__(self, name): - return _MultiCallMethod(self.__call_list, name) - - def __call__(self): - marshalled_list = [] - for name, args in self.__call_list: - marshalled_list.append({'methodName' : name, 'params' : args}) - - return MultiCallIterator(self.__server.system.multicall(marshalled_list)) - -# -------------------------------------------------------------------- -# convenience functions - -## -# Create a parser object, and connect it to an unmarshalling instance. -# This function picks the fastest available XML parser. -# -# return A (parser, unmarshaller) tuple. - -def getparser(use_datetime=0): - """getparser() -> parser, unmarshaller - - Create an instance of the fastest available parser, and attach it - to an unmarshalling object. Return both objects. - """ - if use_datetime and not datetime: - raise ValueError("the datetime module is not available") - if FastParser and FastUnmarshaller: - if use_datetime: - mkdatetime = _datetime_type - else: - mkdatetime = _datetime - target = FastUnmarshaller(True, False, _binary, mkdatetime, Fault) - parser = FastParser(target) - else: - target = Unmarshaller(use_datetime=use_datetime) - if FastParser: - parser = FastParser(target) - elif SgmlopParser: - parser = SgmlopParser(target) - elif ExpatParser: - parser = ExpatParser(target) - else: - parser = SlowParser(target) - return parser, target - -## -# Convert a Python tuple or a Fault instance to an XML-RPC packet. -# -# @def dumps(params, **options) -# @param params A tuple or Fault instance. -# @keyparam methodname If given, create a methodCall request for -# this method name. -# @keyparam methodresponse If given, create a methodResponse packet. -# If used with a tuple, the tuple must be a singleton (that is, -# it must contain exactly one element). -# @keyparam encoding The packet encoding. -# @return A string containing marshalled data. - -def dumps(params, methodname=None, methodresponse=None, encoding=None, - allow_none=0): - """data [,options] -> marshalled data - - Convert an argument tuple or a Fault instance to an XML-RPC - request (or response, if the methodresponse option is used). - - In addition to the data object, the following options can be given - as keyword arguments: - - methodname: the method name for a methodCall packet - - methodresponse: true to create a methodResponse packet. - If this option is used with a tuple, the tuple must be - a singleton (i.e. it can contain only one element). - - encoding: the packet encoding (default is UTF-8) - - All 8-bit strings in the data structure are assumed to use the - packet encoding. Unicode strings are automatically converted, - where necessary. - """ - - assert isinstance(params, TupleType) or isinstance(params, Fault), \ - "argument must be tuple or Fault instance" - - if isinstance(params, Fault): - methodresponse = 1 - elif methodresponse and isinstance(params, TupleType): - assert len(params) == 1, "response tuple must be a singleton" - - if not encoding: - encoding = "utf-8" - - if FastMarshaller: - m = FastMarshaller(encoding) - else: - m = Marshaller(encoding, allow_none) - - data = m.dumps(params) - - if encoding != "utf-8": - xmlheader = "\n" % str(encoding) - else: - xmlheader = "\n" # utf-8 is default - - # standard XML-RPC wrappings - if methodname: - # a method call - if not isinstance(methodname, StringType): - methodname = methodname.encode(encoding) - data = ( - xmlheader, - "\n" - "", methodname, "\n", - data, - "\n" - ) - elif methodresponse: - # a method response, or a fault structure - data = ( - xmlheader, - "\n", - data, - "\n" - ) - else: - return data # return as is - return string.join(data, "") - -## -# Convert an XML-RPC packet to a Python object. If the XML-RPC packet -# represents a fault condition, this function raises a Fault exception. -# -# @param data An XML-RPC packet, given as an 8-bit string. -# @return A tuple containing the unpacked data, and the method name -# (None if not present). -# @see Fault - -def loads(data, use_datetime=0): - """data -> unmarshalled data, method name - - Convert an XML-RPC packet to unmarshalled data plus a method - name (None if not present). - - If the XML-RPC packet represents a fault condition, this function - raises a Fault exception. - """ - p, u = getparser(use_datetime=use_datetime) - p.feed(data) - p.close() - return u.close(), u.getmethodname() - - -# -------------------------------------------------------------------- -# request dispatcher - -class _Method: - # some magic to bind an XML-RPC method to an RPC server. - # supports "nested" methods (e.g. examples.getStateName) - def __init__(self, send, name): - self.__send = send - self.__name = name - def __getattr__(self, name): - return _Method(self.__send, "%s.%s" % (self.__name, name)) - def __call__(self, *args): - return self.__send(self.__name, args) - -## -# Standard transport class for XML-RPC over HTTP. -#

-# You can create custom transports by subclassing this method, and -# overriding selected methods. - -class Transport: - """Handles an HTTP transaction to an XML-RPC server.""" - - # client identifier (may be overridden) - user_agent = "xmlrpclib.py/%s (by www.pythonware.com)" % __version__ - - def __init__(self, use_datetime=0): - self._use_datetime = use_datetime - - ## - # Send a complete request, and parse the response. - # - # @param host Target host. - # @param handler Target PRC handler. - # @param request_body XML-RPC request body. - # @param verbose Debugging flag. - # @return Parsed response. - - def request(self, host, handler, request_body, verbose=0): - # issue XML-RPC request - - h = self.make_connection(host) - if verbose: - h.set_debuglevel(1) - - self.send_request(h, handler, request_body) - self.send_host(h, host) - self.send_user_agent(h) - self.send_content(h, request_body) - - errcode, errmsg, headers = h.getreply() - - if errcode != 200: - raise ProtocolError( - host + handler, - errcode, errmsg, - headers - ) - - self.verbose = verbose - - try: - sock = h._conn.sock - except AttributeError: - sock = None - - return self._parse_response(h.getfile(), sock) - - ## - # Create parser. - # - # @return A 2-tuple containing a parser and a unmarshaller. - - def getparser(self): - # get parser and unmarshaller - return getparser(use_datetime=self._use_datetime) - - ## - # Get authorization info from host parameter - # Host may be a string, or a (host, x509-dict) tuple; if a string, - # it is checked for a "user:pw@host" format, and a "Basic - # Authentication" header is added if appropriate. - # - # @param host Host descriptor (URL or (URL, x509 info) tuple). - # @return A 3-tuple containing (actual host, extra headers, - # x509 info). The header and x509 fields may be None. - - def get_host_info(self, host): - - x509 = {} - if isinstance(host, TupleType): - host, x509 = host - - import urllib - auth, host = urllib.splituser(host) - - if auth: - import base64 - auth = base64.encodestring(urllib.unquote(auth)) - auth = string.join(string.split(auth), "") # get rid of whitespace - extra_headers = [ - ("Authorization", "Basic " + auth) - ] - else: - extra_headers = None - - return host, extra_headers, x509 - - ## - # Connect to server. - # - # @param host Target host. - # @return A connection handle. - - def make_connection(self, host): - # create a HTTP connection object from a host descriptor - import httplib - host, extra_headers, x509 = self.get_host_info(host) - return httplib.HTTP(host) - - ## - # Send request header. - # - # @param connection Connection handle. - # @param handler Target RPC handler. - # @param request_body XML-RPC body. - - def send_request(self, connection, handler, request_body): - connection.putrequest("POST", handler) - - ## - # Send host name. - # - # @param connection Connection handle. - # @param host Host name. - - def send_host(self, connection, host): - host, extra_headers, x509 = self.get_host_info(host) - connection.putheader("Host", host) - if extra_headers: - if isinstance(extra_headers, DictType): - extra_headers = extra_headers.items() - for key, value in extra_headers: - connection.putheader(key, value) - - ## - # Send user-agent identifier. - # - # @param connection Connection handle. - - def send_user_agent(self, connection): - connection.putheader("User-Agent", self.user_agent) - - ## - # Send request body. - # - # @param connection Connection handle. - # @param request_body XML-RPC request body. - - def send_content(self, connection, request_body): - connection.putheader("Content-Type", "text/xml") - connection.putheader("Content-Length", str(len(request_body))) - connection.endheaders() - if request_body: - connection.send(request_body) - - ## - # Parse response. - # - # @param file Stream. - # @return Response tuple and target method. - - def parse_response(self, file): - # compatibility interface - return self._parse_response(file, None) - - ## - # Parse response (alternate interface). This is similar to the - # parse_response method, but also provides direct access to the - # underlying socket object (where available). - # - # @param file Stream. - # @param sock Socket handle (or None, if the socket object - # could not be accessed). - # @return Response tuple and target method. - - def _parse_response(self, file, sock): - # read response from input file/socket, and parse it - - p, u = self.getparser() - - while 1: - if sock: - response = sock.recv(1024) - else: - response = file.read(1024) - if not response: - break - if self.verbose: - sys.stdout.write("body: %s\n" % repr(response)) - p.feed(response) - - file.close() - p.close() - - return u.close() - -## -# Standard transport class for XML-RPC over HTTPS. - -class SafeTransport(Transport): - """Handles an HTTPS transaction to an XML-RPC server.""" - - # FIXME: mostly untested - - def make_connection(self, host): - # create a HTTPS connection object from a host descriptor - # host may be a string, or a (host, x509-dict) tuple - import httplib - host, extra_headers, x509 = self.get_host_info(host) - try: - HTTPS = httplib.HTTPS - except AttributeError: - raise NotImplementedError( - "your version of httplib doesn't support HTTPS" - ) - else: - return HTTPS(host, None, **(x509 or {})) - -## -# Standard server proxy. This class establishes a virtual connection -# to an XML-RPC server. -#

-# This class is available as ServerProxy and Server. New code should -# use ServerProxy, to avoid confusion. -# -# @def ServerProxy(uri, **options) -# @param uri The connection point on the server. -# @keyparam transport A transport factory, compatible with the -# standard transport class. -# @keyparam encoding The default encoding used for 8-bit strings -# (default is UTF-8). -# @keyparam verbose Use a true value to enable debugging output. -# (printed to standard output). -# @see Transport - -class ServerProxy: - """uri [,options] -> a logical connection to an XML-RPC server - - uri is the connection point on the server, given as - scheme://host/target. - - The standard implementation always supports the "http" scheme. If - SSL socket support is available (Python 2.0), it also supports - "https". - - If the target part and the slash preceding it are both omitted, - "/RPC2" is assumed. - - The following options can be given as keyword arguments: - - transport: a transport factory - encoding: the request encoding (default is UTF-8) - - All 8-bit strings passed to the server proxy are assumed to use - the given encoding. - """ - - def __init__(self, uri, transport=None, encoding=None, verbose=0, - allow_none=0, use_datetime=0): - # establish a "logical" server connection - - # get the url - import urllib - type, uri = urllib.splittype(uri) - if type not in ("http", "https"): - raise IOError("unsupported XML-RPC protocol") - self.__host, self.__handler = urllib.splithost(uri) - if not self.__handler: - self.__handler = "/RPC2" - - if transport is None: - if type == "https": - transport = SafeTransport(use_datetime=use_datetime) - else: - transport = Transport(use_datetime=use_datetime) - self.__transport = transport - - self.__encoding = encoding - self.__verbose = verbose - self.__allow_none = allow_none - - def __request(self, methodname, params): - # call a method on the remote server - - request = dumps(params, methodname, encoding=self.__encoding, - allow_none=self.__allow_none) - - response = self.__transport.request( - self.__host, - self.__handler, - request, - verbose=self.__verbose - ) - - if len(response) == 1: - response = response[0] - - return response - - def __repr__(self): - return ( - "" % - (self.__host, self.__handler) - ) - - __str__ = __repr__ - - def __getattr__(self, name): - # magic method dispatcher - return _Method(self.__request, name) - - # note: to call a remote object with an non-standard name, use - # result getattr(server, "strange-python-name")(args) - -# compatibility - -Server = ServerProxy - -# -------------------------------------------------------------------- -# test code - -if __name__ == "__main__": - - # simple test program (from the XML-RPC specification) - - # server = ServerProxy("http://localhost:8000") # local server - server = ServerProxy("http://time.xmlrpc.com/RPC2") - - sys.stdout.write('%s\n' % server) - - try: - sys.stdout.write('%s\n' % (server.currentTime.getCurrentTime(),)) - except Error: - import traceback;traceback.print_exc() - - multi = MultiCall(server) - multi.currentTime.getCurrentTime() - multi.currentTime.getCurrentTime() - try: - for response in multi(): - sys.stdout.write('%s\n' % (response,)) - except Error: - import traceback;traceback.print_exc() diff --git a/python/helpers/pydev/fix_getpass.py b/python/helpers/pydev/fix_getpass.py index c81d93523238..160acc8d1be1 100644 --- a/python/helpers/pydev/fix_getpass.py +++ b/python/helpers/pydev/fix_getpass.py @@ -1,10 +1,13 @@ def fixGetpass(): - import getpass - import warnings - fallback = getattr(getpass, 'fallback_getpass', None) # >= 2.6 - if not fallback: - fallback = getpass.default_getpass # <= 2.5 - getpass.getpass = fallback - if hasattr(getpass, 'GetPassWarning'): - warnings.simplefilter("ignore", category=getpass.GetPassWarning) + try: + import getpass + except ImportError: + return #If we can't import it, we can't fix it + import warnings + fallback = getattr(getpass, 'fallback_getpass', None) # >= 2.6 + if not fallback: + fallback = getpass.default_getpass # <= 2.5 + getpass.getpass = fallback + if hasattr(getpass, 'GetPassWarning'): + warnings.simplefilter("ignore", category=getpass.GetPassWarning) diff --git a/python/helpers/pydev/merge_pydev_pycharm.txt b/python/helpers/pydev/merge_pydev_pycharm.txt index 1cbd356958ae..e5e10f7421a1 100644 --- a/python/helpers/pydev/merge_pydev_pycharm.txt +++ b/python/helpers/pydev/merge_pydev_pycharm.txt @@ -35,13 +35,25 @@ Done in the merge (started from the PyCharm version and bringing in things from - When the code is interrupted, the buffer in the python side is cleared. -- GEvent debugging: for remote debugging, one has to import pydevd before doing the gevent patching -- even if - pydevd.settrace will only be done later. - +- GEvent debugging: improved PyDev not to use the threading module (uses the thread + primitives directly), so, gevent debugging can work even if pydevd is used for + remote debugging. + Also, the gevent debugging should probably be closer to the stackless debugging, where we actually show the live stackless threads -- so, we should show the live - gevent greenlets -- which the current version doesn't do. + gevent greenlets -- which the current version doesn't do (future work). + +- Supporting Jython 2.2 onwards (note: CPython only tested with 2.7/3.3) +- When there are big sets/tuples/lists/dicts, the items won't be all shown so that the + debugger speed doesn't suffer (the user should use the console if he wants to see + those items in this case). The limit was set to show up to 300 items (pydevd_resolver.MAX_ITEMS_TO_HANDLE) + +- Monkey-patching qt (QThread/QRunnable) to enable the debugger to work. + Notes: + - It must be imported before the user actually runs its code (as the definitions of QThread/QRunnable + are monkey-patched), so, for the remote debugger to work, pydevd must be imported at the start of + the program, even if pydevd.settrace will only be used later on. Things to be fixed in PyCharm: -------------------------------- diff --git a/python/helpers/pydev/pycompletionserver.py b/python/helpers/pydev/pycompletionserver.py index 0b11cb6ff4f7..59d08fa0c3c0 100644 --- a/python/helpers/pydev/pycompletionserver.py +++ b/python/helpers/pydev/pycompletionserver.py @@ -17,28 +17,18 @@ except NameError: setattr(__builtin__, 'True', 1) # Python 3.0 does not accept __builtin__.True = 1 in its syntax setattr(__builtin__, 'False', 0) -import pydevd_constants +from pydevd_constants import IS_JYTHON -try: - from java.lang import Thread - IS_JYTHON = True +if IS_JYTHON: SERVER_NAME = 'jycompletionserver' import _pydev_jy_imports_tipper # as _pydev_imports_tipper #changed to be backward compatible with 1.5 _pydev_imports_tipper = _pydev_jy_imports_tipper -except ImportError: +else: # it is python - IS_JYTHON = False SERVER_NAME = 'pycompletionserver' - if pydevd_constants.USE_LIB_COPY: - from _pydev_threading import Thread - else: - from threading import Thread import _pydev_imports_tipper - -from _pydev_imps import _pydev_socket as socket - import sys if sys.platform == "darwin": # See: https://sourceforge.net/projects/pydev/forums/forum/293649/topic/3454227 @@ -62,8 +52,6 @@ for name, mod in sys.modules.items(): import traceback -from _pydev_imps import _pydev_time as time - try: import StringIO except: @@ -185,14 +173,16 @@ class Processor: return '%s(%s)%s' % (MSG_COMPLETIONS, ''.join(compMsg), MSG_END) +class Exit(Exception): + pass -class T(Thread): +class CompletionServer: def __init__(self, port): - Thread.__init__(self) self.ended = False self.port = port self.socket = None # socket to send messages. + self.exit_process_on_kill = True self.processor = Processor() @@ -266,7 +256,7 @@ class T(Thread): while data.find(MSG_END) == -1: received = self.socket.recv(BUFFER_SIZE) if len(received) == 0: - sys.exit(0) # ok, connection ended + raise Exit() # ok, connection ended if IS_PYTHON3K: data = data + received.decode('utf-8') else: @@ -278,7 +268,7 @@ class T(Thread): dbg(SERVER_NAME + ' kill message received', INFO1) # break if we received kill message. self.ended = True - sys.exit(0) + raise Exit() dbg(SERVER_NAME + ' starting keep alive thread', INFO2) @@ -359,7 +349,7 @@ class T(Thread): else: self.send(MSG_INVALID_REQUEST) - except SystemExit: + except Exit: self.send(self.getCompletionsMessage(None, [('Exit:', 'SystemExit', '')])) raise @@ -378,11 +368,12 @@ class T(Thread): self.socket.close() self.ended = True - sys.exit(0) # connection broken + raise Exit() # connection broken - except SystemExit: - raise + except Exit: + if self.exit_process_on_kill: + sys.exit(0) # No need to log SystemExit error except: s = StringIO.StringIO() @@ -399,8 +390,6 @@ if __name__ == '__main__': port = int(sys.argv[1]) # this is from where we want to receive messages. - t = T(port) + t = CompletionServer(port) dbg(SERVER_NAME + ' will start', INFO1) - t.start() - time.sleep(5) - t.join() + t.run() diff --git a/python/helpers/pydev/pydev_console_utils.py b/python/helpers/pydev/pydev_console_utils.py index bd7b7de073d2..6e532183b0d1 100644 --- a/python/helpers/pydev/pydev_console_utils.py +++ b/python/helpers/pydev/pydev_console_utils.py @@ -1,6 +1,5 @@ from pydev_imports import xmlrpclib, _queue, Exec import sys -from pydevd_constants import USE_LIB_COPY from pydevd_constants import IS_JYTHON from _pydev_imps import _pydev_thread as thread import pydevd_xml @@ -418,10 +417,7 @@ class BaseInterpreterInterface: try: # Try to import the packages needed to attach the debugger import pydevd - if USE_LIB_COPY: - import _pydev_threading as threading - else: - import threading + import _pydev_threading as threading except: # This happens on Jython embedded in host eclipse diff --git a/python/helpers/pydev/pydev_imports.py b/python/helpers/pydev/pydev_imports.py index 69804a871eaf..c5132cffbfe3 100644 --- a/python/helpers/pydev/pydev_imports.py +++ b/python/helpers/pydev/pydev_imports.py @@ -53,9 +53,9 @@ except: from pydevd_exec2 import Exec try: - from urllib import quote + from urllib import quote, quote_plus, unquote_plus except: - from urllib.parse import quote #@UnresolvedImport + from urllib.parse import quote, quote_plus, unquote_plus #@UnresolvedImport import os diff --git a/python/helpers/pydev/pydev_ipython/inputhookqt4.py b/python/helpers/pydev/pydev_ipython/inputhookqt4.py index 27598fa742fe..b7e1cf0527a8 100644 --- a/python/helpers/pydev/pydev_ipython/inputhookqt4.py +++ b/python/helpers/pydev/pydev_ipython/inputhookqt4.py @@ -19,11 +19,7 @@ Author: Christian Boos import os import signal -from pydevd_constants import USE_LIB_COPY -if USE_LIB_COPY: - import _pydev_threading as threading -else: - import threading +import threading from pydev_ipython.qt_for_kernel import QtCore, QtGui diff --git a/python/helpers/pydev/pydev_ipython_console.py b/python/helpers/pydev/pydev_ipython_console.py index 0c51dfe3ed44..68c26747c6e0 100644 --- a/python/helpers/pydev/pydev_ipython_console.py +++ b/python/helpers/pydev/pydev_ipython_console.py @@ -9,7 +9,7 @@ os.environ['TERM'] = 'emacs' #to use proper page_more() for paging # Uncomment to force PyDev standard shell. # raise ImportError() -from pydev_ipython_console_011 import PyDevFrontEnd +from pydev_ipython_console_011 import get_pydev_frontend #======================================================================================================================= # InterpreterInterface @@ -23,7 +23,7 @@ class InterpreterInterface(BaseInterpreterInterface): BaseInterpreterInterface.__init__(self, mainThread) self.client_port = client_port self.host = host - self.interpreter = PyDevFrontEnd(host, client_port) + self.interpreter = get_pydev_frontend(host, client_port) self._input_error_printed = False self.notification_succeeded = False self.notification_tries = 0 diff --git a/python/helpers/pydev/pydev_ipython_console_011.py b/python/helpers/pydev/pydev_ipython_console_011.py index 54458e7c4af5..717aaccbc26e 100644 --- a/python/helpers/pydev/pydev_ipython_console_011.py +++ b/python/helpers/pydev/pydev_ipython_console_011.py @@ -19,7 +19,6 @@ import os import codeop from IPython.core.error import UsageError -from IPython.core.inputsplitter import IPythonInputSplitter from IPython.core.completer import IPCompleter from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC from IPython.core.usage import default_banner_parts @@ -53,7 +52,8 @@ def show_in_pager(self, strng): print(strng) def create_editor_hook(pydev_host, pydev_client_port): - def call_editor(self, filename, line=0, wait=True): + + def call_editor(filename, line=0, wait=True): """ Open an editor in PyDev """ if line is None: line = 0 @@ -62,6 +62,9 @@ def create_editor_hook(pydev_host, pydev_client_port): # we don't launch a process. This is more like what happens in the zmqshell filename = os.path.abspath(filename) + # import sys + # sys.__stderr__.write('Calling editor at: %s:%s\n' % (pydev_host, pydev_client_port)) + # Tell PyDev to open the editor server = xmlrpclib.Server('http://%s:%s' % (pydev_host, pydev_client_port)) server.IPythonEditor(filename, str(line)) @@ -291,22 +294,17 @@ class PyDevTerminalInteractiveShell(TerminalInteractiveShell): InteractiveShellABC.register(PyDevTerminalInteractiveShell) # @UndefinedVariable #======================================================================================================================= -# PyDevFrontEnd +# _PyDevFrontEnd #======================================================================================================================= -class PyDevFrontEnd: +class _PyDevFrontEnd: version = release.__version__ - def __init__(self, pydev_host, pydev_client_port, *args, **kwarg): + def __init__(self, *args, **kwarg): # Create and initialize our IPython instance. self.ipython = PyDevTerminalInteractiveShell.instance() - # Back channel to PyDev to open editors (in the future other - # info may go back this way. This is the same channel that is - # used to get stdin, see StdIn in pydev_console_utils) - self.ipython.set_hook('editor', create_editor_hook(pydev_host, pydev_client_port)) - # Display the IPython banner, this has version info and # help info self.ipython.show_banner() @@ -412,6 +410,9 @@ class PyDevFrontEnd: def getNamespace(self): return self.ipython.user_ns + + def clearBuffer(self): + del self._curr_exec_lines[:] def addExec(self, line): if self._curr_exec_lines: @@ -463,3 +464,28 @@ IPython.lib.inputhook.enable_gui = pydev_ipython.inputhook.enable_gui # rely on using the inputhooks directly. for name in pydev_ipython.inputhook.__all__: setattr(IPython.lib.inputhook, name, getattr(pydev_ipython.inputhook, name)) + + +class _PyDevFrontEndContainer: + _instance = None + _last_host_port = None + +def get_pydev_frontend(pydev_host, pydev_client_port): + if _PyDevFrontEndContainer._instance is None: + _PyDevFrontEndContainer._instance = _PyDevFrontEnd() + + if _PyDevFrontEndContainer._last_host_port != (pydev_host, pydev_client_port): + _PyDevFrontEndContainer._last_host_port = pydev_host, pydev_client_port + + # Back channel to PyDev to open editors (in the future other + # info may go back this way. This is the same channel that is + # used to get stdin, see StdIn in pydev_console_utils) + _PyDevFrontEndContainer._instance.ipython.hooks['editor'] = create_editor_hook(pydev_host, pydev_client_port) + + # Note: setting the callback directly because setting it with set_hook would actually create a chain instead + # of ovewriting at each new call). + # _PyDevFrontEndContainer._instance.ipython.set_hook('editor', create_editor_hook(pydev_host, pydev_client_port)) + + return _PyDevFrontEndContainer._instance + + \ No newline at end of file diff --git a/python/helpers/pydev/pydev_localhost.py b/python/helpers/pydev/pydev_localhost.py index 13c4d02bba9e..a4b264ce94ad 100644 --- a/python/helpers/pydev/pydev_localhost.py +++ b/python/helpers/pydev/pydev_localhost.py @@ -1,4 +1,3 @@ - from _pydev_imps import _pydev_socket as socket _cache = None diff --git a/python/helpers/pydev/pydev_monkey.py b/python/helpers/pydev/pydev_monkey.py index 2b12ed27522c..d92378ed0ee1 100644 --- a/python/helpers/pydev/pydev_monkey.py +++ b/python/helpers/pydev/pydev_monkey.py @@ -392,40 +392,42 @@ def patch_new_process_functions_with_warning(): class _NewThreadStartupWithTrace: - def __init__(self, original_func): + def __init__(self, original_func, args, kwargs): self.original_func = original_func + self.args = args + self.kwargs = kwargs - def __call__(self, *args, **kwargs): + def __call__(self): from pydevd_comm import GetGlobalDebugger global_debugger = GetGlobalDebugger() if global_debugger is not None: global_debugger.SetTrace(global_debugger.trace_dispatch) - return self.original_func(*args, **kwargs) + return self.original_func(*self.args, **self.kwargs) class _NewThreadStartupWithoutTrace: - def __init__(self, original_func): + def __init__(self, original_func, args, kwargs): self.original_func = original_func + self.args = args + self.kwargs = kwargs - def __call__(self, *args, **kwargs): - return self.original_func(*args, **kwargs) + def __call__(self): + return self.original_func(*self.args, **self.kwargs) _UseNewThreadStartup = _NewThreadStartupWithTrace -def _get_threading_modules(): - threading_modules = [] - from _pydev_imps import _pydev_thread - threading_modules.append(_pydev_thread) +def _get_threading_modules_to_patch(): + threading_modules_to_patch = [] try: import thread as _thread - threading_modules.append(_thread) + threading_modules_to_patch.append(_thread) except: import _thread - threading_modules.append(_thread) - return threading_modules + threading_modules_to_patch.append(_thread) + return threading_modules_to_patch -threading_modules = _get_threading_modules() +threading_modules_to_patch = _get_threading_modules_to_patch() @@ -439,12 +441,12 @@ def patch_thread_module(thread): class ClassWithPydevStartNewThread: - def pydev_start_new_thread(self, function, args, kwargs={}): + def pydev_start_new_thread(self, function, args=(), kwargs={}): ''' We need to replace the original thread.start_new_thread with this function so that threads started through it and not through the threading module are properly traced. ''' - return _original_start_new_thread(_UseNewThreadStartup(function), args, kwargs) + return _original_start_new_thread(_UseNewThreadStartup(function, args, kwargs), ()) # This is a hack for the situation where the thread.start_new_thread is declared inside a class, such as the one below # class F(object): @@ -465,11 +467,11 @@ def patch_thread_module(thread): pass def patch_thread_modules(): - for t in threading_modules: + for t in threading_modules_to_patch: patch_thread_module(t) def undo_patch_thread_modules(): - for t in threading_modules: + for t in threading_modules_to_patch: try: t.start_new_thread = t._original_start_new_thread except: @@ -494,3 +496,9 @@ def enable_trace_thread_modules(): ''' global _UseNewThreadStartup _UseNewThreadStartup = _NewThreadStartupWithTrace + +def get_original_start_new_thread(threading_module): + try: + return threading_module._original_start_new_thread + except: + return threading_module.start_new_thread diff --git a/python/helpers/pydev/pydev_monkey_qt.py b/python/helpers/pydev/pydev_monkey_qt.py new file mode 100644 index 000000000000..9c62686173dd --- /dev/null +++ b/python/helpers/pydev/pydev_monkey_qt.py @@ -0,0 +1,89 @@ +from __future__ import nested_scopes + +def set_trace_in_qt(): + import pydevd_tracing + from pydevd_comm import GetGlobalDebugger + debugger = GetGlobalDebugger() + if debugger is not None: + pydevd_tracing.SetTrace(debugger.trace_dispatch) + + +_patched_qt = False +def patch_qt(): + ''' + This method patches qt (PySide or PyQt4) so that we have hooks to set the tracing for QThread. + ''' + + # Avoid patching more than once + global _patched_qt + if _patched_qt: + return + + _patched_qt = True + + try: + from PySide import QtCore + except: + try: + from PyQt4 import QtCore + except: + return + + _original_thread_init = QtCore.QThread.__init__ + _original_runnable_init = QtCore.QRunnable.__init__ + + + class FuncWrapper: + + def __init__(self, original): + self._original = original + + def __call__(self, *args, **kwargs): + set_trace_in_qt() + return self._original(*args, **kwargs) + + class StartedSignalWrapper: # Wrapper for the QThread.started signal + + def __init__(self, thread, original_started): + self.thread = thread + self.original_started = original_started + + def connect(self, func, *args, **kwargs): + return self.original_started.connect(FuncWrapper(func), *args, **kwargs) + + def disconnect(self, *args, **kwargs): + return self.original_started.disconnect(*args, **kwargs) + + def emit(self, *args, **kwargs): + return self.original_started.emit(*args, **kwargs) + + + class ThreadWrapper(QtCore.QThread): # Wrapper for QThread + + def __init__(self, *args, **kwargs): + _original_thread_init(self) + + self._original_run = self.run + self.run = self._new_run + self._original_started = self.started + self.started = StartedSignalWrapper(self, self.started) + + def _new_run(self): + set_trace_in_qt() + return self._original_run() + + class RunnableWrapper(QtCore.QRunnable): # Wrapper for QRunnable + + def __init__(self, *args, **kwargs): + _original_runnable_init(self) + + self._original_run = self.run + self.run = self._new_run + + + def _new_run(self): + set_trace_in_qt() + return self._original_run() + + QtCore.QThread = ThreadWrapper + QtCore.QRunnable = RunnableWrapper diff --git a/python/helpers/pydev/pydev_runfiles_parallel.py b/python/helpers/pydev/pydev_runfiles_parallel.py index e14f36d79139..91f55283d5c5 100644 --- a/python/helpers/pydev/pydev_runfiles_parallel.py +++ b/python/helpers/pydev/pydev_runfiles_parallel.py @@ -1,4 +1,5 @@ import unittest +from _pydev_imps import _pydev_thread try: import Queue except: @@ -282,13 +283,9 @@ class ClientThread(threading.Thread): if False: proc = subprocess.Popen(args, env=os.environ, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout_thread = threading.Thread(target=self._reader_thread,args=(proc.stdout, sys.stdout)) - stdout_thread.setDaemon(True) - stdout_thread.start() + _pydev_thread.start_new_thread(self._reader_thread,(proc.stdout, sys.stdout)) - stderr_thread = threading.Thread(target=self._reader_thread,args=(proc.stderr, sys.stderr)) - stderr_thread.setDaemon(True) - stderr_thread.start() + _pydev_thread.start_new_thread(target=self._reader_thread,args=(proc.stderr, sys.stderr)) else: proc = subprocess.Popen(args, env=os.environ, shell=False) proc.wait() diff --git a/python/helpers/pydev/pydev_runfiles_xml_rpc.py b/python/helpers/pydev/pydev_runfiles_xml_rpc.py index bcaa38a53ae2..67bf4804b89b 100644 --- a/python/helpers/pydev/pydev_runfiles_xml_rpc.py +++ b/python/helpers/pydev/pydev_runfiles_xml_rpc.py @@ -1,3 +1,4 @@ + import traceback import warnings diff --git a/python/helpers/pydev/pydevconsole.py b/python/helpers/pydev/pydevconsole.py index 2f07a826aa7d..a5ece54b972b 100644 --- a/python/helpers/pydev/pydevconsole.py +++ b/python/helpers/pydev/pydevconsole.py @@ -1,3 +1,5 @@ +from _pydev_imps._pydev_thread import start_new_thread + try: from code import InteractiveConsole except ImportError: @@ -9,12 +11,7 @@ from code import InteractiveInterpreter import os import sys -from pydevd_constants import USE_LIB_COPY - -if USE_LIB_COPY: - import _pydev_threading as threading -else: - import threading +import _pydev_threading as threading import traceback import fix_getpass @@ -61,13 +58,14 @@ class Command: self.code_fragment = code_fragment self.more = None - @staticmethod + def symbol_for_fragment(code_fragment): if code_fragment.is_single_line: symbol = 'single' else: symbol = 'exec' # Jython doesn't support this return symbol + symbol_for_fragment = staticmethod(symbol_for_fragment) def run(self): text = self.code_fragment.text @@ -304,11 +302,7 @@ def StartServer(host, port, client_port): interpreter = InterpreterInterface(host, client_port, threading.currentThread()) - server_thread = threading.Thread(target=start_server, - name='ServerThread', - args=(host, port, interpreter)) - server_thread.setDaemon(True) - server_thread.start() + start_new_thread(start_server,(host, port, interpreter)) process_exec_queue(interpreter) diff --git a/python/helpers/pydev/pydevd.py b/python/helpers/pydev/pydevd.py index 1733c26b5e91..2e5c484e4448 100644 --- a/python/helpers/pydev/pydevd.py +++ b/python/helpers/pydev/pydevd.py @@ -1,10 +1,12 @@ #IMPORTANT: pydevd_constants must be the 1st thing defined because it'll keep a reference to the original sys._getframe from __future__ import nested_scopes # Jython 2.1 support +import pydev_monkey_qt +pydev_monkey_qt.patch_qt() + import traceback from django_debug import DjangoLineBreakpoint -from pydevd_signature import SignatureFactory from pydevd_frame import add_exception_to_frame import pydev_imports from pydevd_breakpoints import * #@UnusedWildImport @@ -81,14 +83,12 @@ from pydevd_custom_frames import CustomFramesContainer, CustomFramesContainerIni import pydevd_dont_trace import pydevd_traceproperty -from _pydev_imps import _pydev_time as time +from _pydev_imps import _pydev_time as time, _pydev_thread -if USE_LIB_COPY: - import _pydev_threading as threading -else: - import threading +import _pydev_threading as threading import os +import atexit threadingEnumerate = threading.enumerate @@ -112,9 +112,11 @@ DONT_TRACE = { '_pydev_execfile.py':1, '_pydev_jython_execfile.py':1, '_pydev_threading':1, + '_pydev_Queue':1, 'django_debug.py':1, 'django_frame.py':1, 'pydev_log.py':1, + 'pydev_monkey.py':1 , 'pydevd.py':1 , 'pydevd_additional_thread_info.py':1, 'pydevd_comm.py':1, @@ -219,7 +221,7 @@ class PyDBCommandThread(PyDBDaemonThread): def killAllPydevThreads(): - threads = threadingEnumerate() + threads = DictKeys(PyDBDaemonThread.created_pydb_daemon_threads) for t in threads: if hasattr(t, 'doKillPydevThread'): t.doKillPydevThread() @@ -233,12 +235,23 @@ class PyDBCheckAliveThread(PyDBDaemonThread): def __init__(self, pyDb): PyDBDaemonThread.__init__(self) self.pyDb = pyDb - self.setDaemon(False) self.setName('pydevd.CheckAliveThread') def OnRun(self): if self.dontTraceMe: - self.pyDb.SetTrace(None) # no debugging on this thread + + disable_tracing = True + + if pydevd_vm_type.GetVmType() == pydevd_vm_type.PydevdVmType.JYTHON and sys.hexversion <= 0x020201f0: + # don't run untraced threads if we're in jython 2.2.1 or lower + # jython bug: if we start a thread and another thread changes the tracing facility + # it affects other threads (it's not set only for the thread but globally) + # Bug: http://sourceforge.net/tracker/index.php?func=detail&aid=1870039&group_id=12867&atid=112867 + disable_tracing = False + + if disable_tracing: + pydevd_tracing.SetTrace(None) # no debugging on this thread + while not self.killReceived: if not self.pyDb.haveAliveThreads(): try: @@ -298,8 +311,8 @@ class PyDB: self.django_exception_break = {} self.readyToRun = False - self._main_lock = threading.Lock() - self._lock_running_thread_ids = threading.Lock() + self._main_lock = _pydev_thread.allocate_lock() + self._lock_running_thread_ids = _pydev_thread.allocate_lock() self._py_db_command_thread_event = threading.Event() CustomFramesContainer._py_db_command_thread_event = self._py_db_command_thread_event self._finishDebuggingSession = False @@ -332,7 +345,11 @@ class PyDB: def haveAliveThreads(self): for t in threadingEnumerate(): - if not isinstance(t, PyDBDaemonThread) and isThreadAlive(t) and not t.isDaemon(): + if isinstance(t, PyDBDaemonThread): + pydev_log.error_once( + 'Error in debugger: Found PyDBDaemonThread through threading.enumerate().\n') + + if isThreadAlive(t) and not t.isDaemon(): return True return False @@ -387,11 +404,9 @@ class PyDB: if thread_id == "*": threads = threadingEnumerate() for t in threads: - thread_name = t.getName() - if not thread_name.startswith('pydevd.') or thread_name == 'pydevd.CommandThread': - thread_id = GetThreadId(t) - queue = self.getInternalQueue(thread_id) - queue.put(int_cmd) + thread_id = GetThreadId(t) + queue = self.getInternalQueue(thread_id) + queue.put(int_cmd) else: queue = self.getInternalQueue(thread_id) @@ -442,7 +457,13 @@ class PyDB: for t in all_threads: thread_id = GetThreadId(t) - if not isinstance(t, PyDBDaemonThread) and isThreadAlive(t): + if isinstance(t, PyDBDaemonThread): + pydev_log.error_once('Found PyDBDaemonThread in threading.enumerate.') + + elif getattr(t, 'is_pydev_daemon_thread', False): + pass # I.e.: skip the DummyThreads created from pydev daemon threads + + elif isThreadAlive(t): program_threads_alive[thread_id] = t if not DictContains(self._running_thread_ids, thread_id): @@ -505,19 +526,18 @@ class PyDB: threads = threadingEnumerate() try: for t in threads: - if not t.getName().startswith('pydevd.'): - # TODO: optimize so that we only actually add that tracing if it's in - # the new breakpoint context. - additionalInfo = None - try: - additionalInfo = t.additionalInfo - except AttributeError: - pass # that's ok, no info currently set + # TODO: optimize so that we only actually add that tracing if it's in + # the new breakpoint context. + additionalInfo = None + try: + additionalInfo = t.additionalInfo + except AttributeError: + pass # that's ok, no info currently set - if additionalInfo is not None: - for frame in additionalInfo.IterFrames(): - if frame is not ignore_frame: - self.SetTraceForFrameAndParents(frame, overwrite_prev_trace=overwrite_prev_trace) + if additionalInfo is not None: + for frame in additionalInfo.IterFrames(): + if frame is not ignore_frame: + self.SetTraceForFrameAndParents(frame, overwrite_prev_trace=overwrite_prev_trace) finally: frame = None t = None @@ -592,7 +612,7 @@ class PyDB: it may be worth refactoring it (actually, reordering the ifs so that the ones used mostly come before probably will give better performance). ''' - #print ID_TO_MEANING[str(cmd_id)], repr(text) + #print(ID_TO_MEANING[str(cmd_id)], repr(text)) self._main_lock.acquire() try: @@ -834,7 +854,7 @@ class PyDB: id_to_pybreakpoint[breakpoint_id] = breakpoint self.consolidate_breakpoints(file, id_to_pybreakpoint, breakpoints) - self.setTracingForUntracedContexts() + self.setTracingForUntracedContexts(overwrite_prev_trace=True) elif cmd_id == CMD_REMOVE_BREAK: #command to remove some breakpoint @@ -862,7 +882,7 @@ class PyDB: raise NameError(breakpoint_type) try: - id_to_pybreakpoint = file_to_id_to_breakpoint[file] + id_to_pybreakpoint = file_to_id_to_breakpoint.get(file, {}) if DebugInfoHolder.DEBUG_TRACE_BREAKPOINTS > 0: existing = id_to_pybreakpoint[breakpoint_id] sys.stderr.write('Removed breakpoint:%s - line:%s - func_name:%s (id: %s)\n' % ( @@ -1319,7 +1339,7 @@ class PyDB: if self._finishDebuggingSession and not self._terminationEventSent: #that was not working very well because jython gave some socket errors try: - threads = threadingEnumerate() + threads = DictKeys(PyDBDaemonThread.created_pydb_daemon_threads) for t in threads: if hasattr(t, 'doKillPydevThread'): t.doKillPydevThread() @@ -1332,10 +1352,10 @@ class PyDB: is_file_to_ignore = DictContains(DONT_TRACE, base) #we don't want to debug threading or anything related to pydevd + #print('trace_dispatch', base, frame.f_lineno, event, frame.f_code.co_name, is_file_to_ignore) if is_file_to_ignore: return None - #print('trace_dispatch', base, frame.f_lineno, event, frame.f_code.co_name) try: #this shouldn't give an exception, but it could happen... (python bug) #see http://mail.python.org/pipermail/python-bugs-list/2007-June/038796.html @@ -1401,8 +1421,9 @@ class PyDB: - def SetTraceForFrameAndParents(self, frame, also_add_to_passed_frame=True, overwrite_prev_trace=False): - dispatch_func = self.trace_dispatch + def SetTraceForFrameAndParents(self, frame, also_add_to_passed_frame=True, overwrite_prev_trace=False, dispatch_func=None): + if dispatch_func is None: + dispatch_func = self.trace_dispatch if also_add_to_passed_frame: self.update_trace(frame, dispatch_func, overwrite_prev_trace) @@ -1439,8 +1460,8 @@ class PyDB: net = NetCommand(str(CMD_THREAD_CREATE), 0, '') self.writer.addCommand(net) - pydevd_tracing.SetTrace(self.trace_dispatch) self.patch_threads() + pydevd_tracing.SetTrace(self.trace_dispatch) PyDBCommandThread(self).start() @@ -1543,43 +1564,47 @@ def processCommandLine(argv): setup['multiproc'] = False #Used by PyCharm (reuses connection: ssh tunneling) setup['multiprocess'] = False # Used by PyDev (creates new connection to ide) setup['save-signatures'] = False + setup['print-in-debugger-startup'] = False i = 0 del argv[0] while (i < len(argv)): - if (argv[i] == '--port'): + if argv[i] == '--port': del argv[i] setup['port'] = int(argv[i]) del argv[i] - elif (argv[i] == '--vm_type'): + elif argv[i] == '--vm_type': del argv[i] setup['vm_type'] = argv[i] del argv[i] - elif (argv[i] == '--client'): + elif argv[i] == '--client': del argv[i] setup['client'] = argv[i] del argv[i] - elif (argv[i] == '--server'): + elif argv[i] == '--server': del argv[i] setup['server'] = True - elif (argv[i] == '--file'): + elif argv[i] == '--file': del argv[i] setup['file'] = argv[i] i = len(argv) # pop out, file is our last argument - elif (argv[i] == '--DEBUG_RECORD_SOCKET_READS'): + elif argv[i] == '--DEBUG_RECORD_SOCKET_READS': del argv[i] setup['DEBUG_RECORD_SOCKET_READS'] = True - elif (argv[i] == '--DEBUG'): + elif argv[i] == '--DEBUG': del argv[i] set_debug(setup) - elif (argv[i] == '--multiproc'): + elif argv[i] == '--multiproc': del argv[i] setup['multiproc'] = True - elif (argv[i] == '--multiprocess'): + elif argv[i] == '--multiprocess': del argv[i] setup['multiprocess'] = True - elif (argv[i] == '--save-signatures'): + elif argv[i] == '--save-signatures': del argv[i] setup['save-signatures'] = True + elif argv[i] == '--print-in-debugger-startup': + del argv[i] + setup['print-in-debugger-startup'] = True else: raise ValueError("unexpected option " + argv[i]) return setup @@ -1590,18 +1615,6 @@ def usage(doExit=0): if doExit: sys.exit(0) -def SetTraceForParents(frame, dispatch_func): - frame = frame.f_back - while frame: - if frame.f_trace is None: - frame.f_trace = dispatch_func - - frame = frame.f_back - del frame - -def exit_hook(): - debugger = GetGlobalDebugger() - debugger.exiting() def initStdoutRedirect(): if not getattr(sys, 'stdoutBuf', None): @@ -1666,7 +1679,7 @@ def settrace( -_set_trace_lock = threading.Lock() +_set_trace_lock = _pydev_thread.allocate_lock() def _locked_settrace( host, @@ -1748,7 +1761,9 @@ def _locked_settrace( # As this is the first connection, also set tracing for any untraced threads debugger.setTracingForUntracedContexts(ignore_frame=GetFrame(), overwrite_prev_trace=overwrite_prev_trace) - sys.exitfunc = exit_hook + # Stop the tracing as the last thing before the actual shutdown for a clean exit. + atexit.register(stoptrace) + #Suspend as the last thing after all tracing is in place. if suspend: debugger.setSuspend(t, CMD_SET_BREAK) @@ -1793,16 +1808,15 @@ def stoptrace(): from pydev_monkey import undo_patch_thread_modules undo_patch_thread_modules() - + debugger = GetGlobalDebugger() - + if debugger: - debugger.trace_dispatch = None - - debugger.SetTraceForFrameAndParents(GetFrame(), False) - + + debugger.SetTraceForFrameAndParents( + GetFrame(), also_add_to_passed_frame=True, overwrite_prev_trace=True, dispatch_func=lambda *args:None) debugger.exiting() - + killAllPydevThreads() connected = False @@ -1893,6 +1907,7 @@ class SetupHolder: # main #======================================================================================================================= if __name__ == '__main__': + # parse the command line. --file is our last argument that is required try: sys.original_argv = sys.argv[:] @@ -1902,6 +1917,12 @@ if __name__ == '__main__': traceback.print_exc() usage(1) + if setup['print-in-debugger-startup']: + try: + pid = ' (pid: %s)' % os.getpid() + except: + pid = '' + sys.stderr.write("pydev debugger: starting%s\n" % pid) fix_getpass.fixGetpass() @@ -2047,6 +2068,8 @@ if __name__ == '__main__': if pydevd_vm_type.GetVmType() == pydevd_vm_type.PydevdVmType.JYTHON: sys.stderr.write("Collecting run-time type information is not supported for Jython\n") else: + # Only import it if we're going to use it! + from pydevd_signature import SignatureFactory debugger.signature_factory = SignatureFactory() try: @@ -2059,3 +2082,4 @@ if __name__ == '__main__': connected = True # Mark that we're connected when started from inside ide. debugger.run(setup['file'], None, None) + diff --git a/python/helpers/pydev/pydevd_additional_thread_info.py b/python/helpers/pydev/pydevd_additional_thread_info.py index fa906adf385e..76fb49ed1986 100644 --- a/python/helpers/pydev/pydevd_additional_thread_info.py +++ b/python/helpers/pydev/pydevd_additional_thread_info.py @@ -1,9 +1,6 @@ import sys from pydevd_constants import * #@UnusedWildImport -if USE_LIB_COPY: - import _pydev_threading as threading -else: - import threading +from _pydev_imps import _pydev_thread from pydevd_frame import PyDBFrame import weakref @@ -62,7 +59,7 @@ class PyDBAdditionalThreadInfoWithoutCurrentFramesSupport(AbstractPyDBAdditional #Or if the user compiled threadframe (from http://www.majid.info/mylos/stories/2004/06/10/threadframe.html) #NOT RLock!! (could deadlock if it was) - self.lock = threading.Lock() + self.lock = _pydev_thread.allocate_lock() self._acquire_lock = self.lock.acquire self._release_lock = self.lock.release diff --git a/python/helpers/pydev/pydevd_breakpoints.py b/python/helpers/pydev/pydevd_breakpoints.py index 82a230db2f47..1171157257e9 100644 --- a/python/helpers/pydev/pydevd_breakpoints.py +++ b/python/helpers/pydev/pydevd_breakpoints.py @@ -8,10 +8,7 @@ _original_excepthook = None _handle_exceptions = None -if USE_LIB_COPY: - import _pydev_threading as threading -else: - import threading +import _pydev_threading as threading threadingCurrentThread = threading.currentThread diff --git a/python/helpers/pydev/pydevd_comm.py b/python/helpers/pydev/pydevd_comm.py index c7f39a16c483..d38d35541aa1 100644 --- a/python/helpers/pydev/pydevd_comm.py +++ b/python/helpers/pydev/pydevd_comm.py @@ -61,12 +61,8 @@ from pydevd_constants import * #@UnusedWildImport import sys -from _pydev_imps import _pydev_time as time - -if USE_LIB_COPY: - import _pydev_threading as threading -else: - import threading +from _pydev_imps import _pydev_time as time, _pydev_thread +import _pydev_threading as threading from _pydev_imps._pydev_socket import socket, AF_INET, SOCK_STREAM, SHUT_RD, SHUT_WR from pydev_imports import _queue @@ -246,22 +242,42 @@ def SetGlobalDebugger(dbg): #======================================================================================================================= # PyDBDaemonThread #======================================================================================================================= -class PyDBDaemonThread(threading.Thread): +class PyDBDaemonThread: + + created_pydb_daemon_threads = {} def __init__(self): - threading.Thread.__init__(self) - self.setDaemon(True) + # Note: subclasses are always daemon threads. self.killReceived = False self.dontTraceMe = True - def run(self): - if sys.platform.startswith("java"): - import org.python.core as PyCore #@UnresolvedImport - ss = PyCore.PySystemState() - # Note: Py.setSystemState() affects only the current thread. - PyCore.Py.setSystemState(ss) + def setName(self, name): + self.name = name - self.OnRun() + def start(self): + import pydev_monkey + start_new_thread = pydev_monkey.get_original_start_new_thread(_pydev_thread) + start_new_thread(self.run, ()) + + def run(self): + created_pydb_daemon = self.created_pydb_daemon_threads + created_pydb_daemon[self] = 1 + dummy_thread = threading.currentThread() + dummy_thread.is_pydev_daemon_thread = True + try: + try: + if IS_JYTHON: + import org.python.core as PyCore #@UnresolvedImport + ss = PyCore.PySystemState() + # Note: Py.setSystemState() affects only the current thread. + PyCore.Py.setSystemState(ss) + + self.OnRun() + except: + if sys is not None and traceback is not None: + traceback.print_exc() + finally: + del created_pydb_daemon[self] def OnRun(self): raise NotImplementedError('Should be reimplemented by: %s' % self.__class__) @@ -272,7 +288,18 @@ class PyDBDaemonThread(threading.Thread): def stopTrace(self): if self.dontTraceMe: - pydevd_tracing.SetTrace(None) # no debugging on this thread + + disable_tracing = True + + if pydevd_vm_type.GetVmType() == pydevd_vm_type.PydevdVmType.JYTHON and sys.hexversion <= 0x020201f0: + # don't run untraced threads if we're in jython 2.2.1 or lower + # jython bug: if we start a thread and another thread changes the tracing facility + # it affects other threads (it's not set only for the thread but globally) + # Bug: http://sourceforge.net/tracker/index.php?func=detail&aid=1870039&group_id=12867&atid=112867 + disable_tracing = False + + if disable_tracing: + pydevd_tracing.SetTrace(None) # no debugging on this thread #======================================================================================================================= @@ -355,7 +382,6 @@ class WriterThread(PyDBDaemonThread): """ writer thread writes out the commands in an infinite loop """ def __init__(self, sock): PyDBDaemonThread.__init__(self) - self.setDaemon(False) #writer isn't daemon to be able to deliver all messages after main thread terminated self.sock = sock self.setName("pydevd.Writer") self.cmdQueue = _queue.Queue() @@ -373,11 +399,16 @@ class WriterThread(PyDBDaemonThread): """ just loop and write responses """ self.stopTrace() + get_has_timeout = sys.hexversion >= 0x02030000 # 2.3 onwards have it. try: while True: try: try: - cmd = self.cmdQueue.get(1, 0.1) + if get_has_timeout: + cmd = self.cmdQueue.get(1, 0.1) + else: + time.sleep(.01) + cmd = self.cmdQueue.get(0) except _queue.Empty: if self.killReceived: try: @@ -774,7 +805,7 @@ class ReloadCodeCommand(InternalThreadCommand): self.thread_id = thread_id self.module_name = module_name self.executed = False - self.lock = threading.Lock() + self.lock = _pydev_thread.allocate_lock() def canBeExecutedBy(self, thread_id): @@ -1155,8 +1186,8 @@ class InternalEvaluateConsoleExpression(InternalThreadCommand): from pydevd_console import ConsoleMessage console_message = ConsoleMessage() console_message.add_console_message( - pydevd_console.CONSOLE_ERROR, - "Select the valid frame in the debug view (thread: %s, frame: %s invalid)" % (self.thread_id, self.frame_id), + pydevd_console.CONSOLE_ERROR, + "Select the valid frame in the debug view (thread: %s, frame: %s invalid)" % (self.thread_id, self.frame_id), ) cmd = dbg.cmdFactory.makeErrorMessage(self.sequence, console_message.toXML()) except: diff --git a/python/helpers/pydev/pydevd_constants.py b/python/helpers/pydev/pydevd_constants.py index 74e897461458..39907a99c6ea 100644 --- a/python/helpers/pydev/pydevd_constants.py +++ b/python/helpers/pydev/pydevd_constants.py @@ -73,12 +73,8 @@ SUPPORT_GEVENT = os.getenv('GEVENT_SUPPORT', 'False') == 'True' USE_LIB_COPY = SUPPORT_GEVENT and not IS_PY3K and sys.version_info[1] >= 6 -if USE_LIB_COPY: - import _pydev_threading as threading -else: - import threading - -_nextThreadIdLock = threading.Lock() +from _pydev_imps import _pydev_thread +_nextThreadIdLock = _pydev_thread.allocate_lock() #======================================================================================================================= # Jython? diff --git a/python/helpers/pydev/pydevd_custom_frames.py b/python/helpers/pydev/pydevd_custom_frames.py index e259356b8336..8709e6a17dd6 100644 --- a/python/helpers/pydev/pydevd_custom_frames.py +++ b/python/helpers/pydev/pydevd_custom_frames.py @@ -1,5 +1,6 @@ from pydevd_constants import * #@UnusedWildImport from pydevd_file_utils import GetFilenameAndBase +from _pydev_imps import _pydev_thread threadingCurrentThread = threading.currentThread DEBUG = False @@ -13,7 +14,7 @@ class CustomFramesContainer: def CustomFramesContainerInit(): #Note: no staticmethod on jython 2.1 (so, use free-function) - CustomFramesContainer.custom_frames_lock = threading.Lock() + CustomFramesContainer.custom_frames_lock = _pydev_thread.allocate_lock() # custom_frames can only be accessed if properly locked with custom_frames_lock! # Key is a string identifying the frame (as well as the thread it belongs to). diff --git a/python/helpers/pydev/pydevd_frame.py b/python/helpers/pydev/pydevd_frame.py index 374d2818bf87..5d1e78458391 100644 --- a/python/helpers/pydev/pydevd_frame.py +++ b/python/helpers/pydev/pydevd_frame.py @@ -15,7 +15,11 @@ from pydevd_comm import CMD_ADD_DJANGO_EXCEPTION_BREAK, \ CMD_STEP_INTO, CMD_SMART_STEP_INTO, CMD_RUN_TO_LINE, CMD_SET_NEXT_STATEMENT from pydevd_constants import * # @UnusedWildImport from pydevd_file_utils import GetFilenameAndBase -from pydevd_signature import sendSignatureCallTrace +try: + from pydevd_signature import sendSignatureCallTrace +except ImportError: + def sendSignatureCallTrace(*args, **kwargs): + pass import pydevd_vars import pydevd_dont_trace diff --git a/python/helpers/pydev/pydevd_resolver.py b/python/helpers/pydev/pydevd_resolver.py index 3fe895c504a7..ad49bd881ba0 100644 --- a/python/helpers/pydev/pydevd_resolver.py +++ b/python/helpers/pydev/pydevd_resolver.py @@ -13,10 +13,13 @@ except: setattr(__builtin__, 'False', 0) import pydevd_constants -from pydevd_constants import DictIterItems, xrange, izip +from pydevd_constants import DictIterItems, xrange -MAX_ITEMS_TO_HANDLE = 500 +# Note: 300 is already a lot to see in the outline (after that the user should really use the shell to get things) +# and this also means we'll pass less information to the client side (which makes debugging faster). +MAX_ITEMS_TO_HANDLE = 300 + TOO_LARGE_MSG = 'Too large to show contents. Max items to show: ' + str(MAX_ITEMS_TO_HANDLE) TOO_LARGE_ATTR = 'Unable to handle:' @@ -272,19 +275,20 @@ class TupleResolver: #to enumerate tuples and lists return var[int(attribute)] def getDictionary(self, var): - #return dict( [ (i, x) for i, x in enumerate(var) ] ) - # modified 'cause jython does not have enumerate support l = len(var) d = {} - if l < MAX_ITEMS_TO_HANDLE: - format = '%0' + str(int(len(str(l)))) + 'd' + format_str = '%0' + str(int(len(str(l)))) + 'd' - - for i, item in izip(xrange(l), var): - d[ format % i ] = item - else: - d[TOO_LARGE_ATTR] = TOO_LARGE_MSG + i = 0 + for item in var: + d[format_str % i] = item + i += 1 + + if i > MAX_ITEMS_TO_HANDLE: + d[TOO_LARGE_ATTR] = TOO_LARGE_MSG + break + d['__len__'] = len(var) return d @@ -381,13 +385,24 @@ class NdArrayResolver: This resolves a numpy ndarray returning some metadata about the NDArray ''' + def is_numeric(self, obj): + if not hasattr(obj, 'dtype'): + return False + return obj.dtype.kind in 'biufc' + def resolve(self, obj, attribute): if attribute == '__internals__': return defaultResolver.getDictionary(obj) if attribute == 'min': - return obj.min() + if self.is_numeric(obj): + return obj.min() + else: + return None if attribute == 'max': - return obj.max() + if self.is_numeric(obj): + return obj.max() + else: + return None if attribute == 'shape': return obj.shape if attribute == 'dtype': @@ -403,8 +418,12 @@ class NdArrayResolver: ret['min'] = 'ndarray too big, calculating min would slow down debugging' ret['max'] = 'ndarray too big, calculating max would slow down debugging' else: - ret['min'] = obj.min() - ret['max'] = obj.max() + if self.is_numeric(obj): + ret['min'] = obj.min() + ret['max'] = obj.max() + else: + ret['min'] = 'not a numeric object' + ret['max'] = 'not a numeric object' ret['shape'] = obj.shape ret['dtype'] = obj.dtype ret['size'] = obj.size diff --git a/python/helpers/pydev/pydevd_signature.py b/python/helpers/pydev/pydevd_signature.py index 03dc0eb9c98b..d7b37c84cb76 100644 --- a/python/helpers/pydev/pydevd_signature.py +++ b/python/helpers/pydev/pydevd_signature.py @@ -1,8 +1,13 @@ import inspect -import trace import os -trace._warn = lambda *args: None # workaround for http://bugs.python.org/issue17143 (PY-8706) +try: + import trace +except ImportError: + pass +else: + trace._warn = lambda *args: None # workaround for http://bugs.python.org/issue17143 (PY-8706) + import gc from pydevd_comm import CMD_SIGNATURE_CALL_TRACE, NetCommand import pydevd_vars diff --git a/python/helpers/pydev/pydevd_tracing.py b/python/helpers/pydev/pydevd_tracing.py index 7bc1ba5c2c23..d362462013a9 100644 --- a/python/helpers/pydev/pydevd_tracing.py +++ b/python/helpers/pydev/pydevd_tracing.py @@ -1,4 +1,5 @@ from pydevd_constants import * #@UnusedWildImport +from _pydev_imps import _pydev_thread try: import cStringIO as StringIO #may not always be available @UnusedImport @@ -8,10 +9,6 @@ except: except: import io as StringIO -if USE_LIB_COPY: - import _pydev_threading as threading -else: - import threading import sys #@Reimport import traceback @@ -21,7 +18,7 @@ class TracingFunctionHolder: ''' _original_tracing = None _warn = True - _lock = threading.Lock() + _lock = _pydev_thread.allocate_lock() _traceback_limit = 1 _warnings_shown = {} diff --git a/python/helpers/pydev/pydevd_vars.py b/python/helpers/pydev/pydevd_vars.py index 0cc45f73710f..e53c3ffb4342 100644 --- a/python/helpers/pydev/pydevd_vars.py +++ b/python/helpers/pydev/pydevd_vars.py @@ -7,6 +7,7 @@ from types import * #@UnusedWildImport from pydevd_custom_frames import getCustomFrame from pydevd_xml import * +from _pydev_imps import _pydev_thread try: from StringIO import StringIO @@ -14,10 +15,7 @@ except ImportError: from io import StringIO import sys #@Reimport -if USE_LIB_COPY: - import _pydev_threading as threading -else: - import threading +import _pydev_threading as threading import traceback import pydevd_save_locals from pydev_imports import Exec, execfile @@ -69,7 +67,7 @@ def dumpFrames(thread_id): # AdditionalFramesContainer #=============================================================================== class AdditionalFramesContainer: - lock = threading.Lock() + lock = _pydev_thread.allocate_lock() additional_frames = {} #dict of dicts diff --git a/python/helpers/pydev/requirements.txt b/python/helpers/pydev/requirements.txt new file mode 100644 index 000000000000..048a4c65c919 --- /dev/null +++ b/python/helpers/pydev/requirements.txt @@ -0,0 +1,4 @@ +Django==1.6.5 +nose==1.3.3 +ipython==2.1.0 +numpy==1.8.2 \ No newline at end of file diff --git a/python/helpers/pydev/runfiles.py b/python/helpers/pydev/runfiles.py index 67c88be4fe7c..c2db611055c4 100644 --- a/python/helpers/pydev/runfiles.py +++ b/python/helpers/pydev/runfiles.py @@ -75,7 +75,7 @@ def main(): if test_framework == 0: - pydev_runfiles.main(configuration) + return pydev_runfiles.main(configuration) #Note: still doesn't return a proper value. else: #We'll convert the parameters to what nose or py.test expects. @@ -144,7 +144,8 @@ def main(): import pydev_runfiles_nose PYDEV_NOSE_PLUGIN_SINGLETON = pydev_runfiles_nose.StartPydevNosePluginSingleton(configuration) argv.append('--with-pydevplugin') - nose.run(argv=argv, addplugins=[PYDEV_NOSE_PLUGIN_SINGLETON]) + # Return 'not' because it will return 'success' (so, exit == 0 if success) + return not nose.run(argv=argv, addplugins=[PYDEV_NOSE_PLUGIN_SINGLETON]) elif test_framework == PY_TEST_FRAMEWORK: if DEBUG: @@ -189,7 +190,7 @@ def main(): argv.append('-p') argv.append('pydev_runfiles_pytest2') - pytest.main(argv) + return pytest.main(argv) else: raise AssertionError('Cannot handle test framework: %s at this point.' % (test_framework,)) diff --git a/python/helpers/pydev/tests/check_pydevconsole.py b/python/helpers/pydev/tests/test_check_pydevconsole.py similarity index 59% rename from python/helpers/pydev/tests/check_pydevconsole.py rename to python/helpers/pydev/tests/test_check_pydevconsole.py index 7d1b7eed4e0b..957e4314a9ab 100644 --- a/python/helpers/pydev/tests/check_pydevconsole.py +++ b/python/helpers/pydev/tests/test_check_pydevconsole.py @@ -1,19 +1,10 @@ -import sys -import os - -#Put pydevconsole in the path. -sys.argv[0] = os.path.dirname(sys.argv[0]) -sys.path.insert(1, os.path.join(os.path.dirname(sys.argv[0]))) - -print('Running tests with:', sys.executable) -print('PYTHONPATH:') -print('\n'.join(sorted(sys.path))) - import threading import unittest import pydevconsole from pydev_imports import xmlrpclib, SimpleXMLRPCServer +from pydev_localhost import get_localhost +from pydev_ipython_console_011 import get_pydev_frontend try: raw_input @@ -36,17 +27,28 @@ class Test(unittest.TestCase): def run(self): class HandleRequestInput: def RequestInput(self): + client_thread.requested_input = True return 'RequestInput: OK' + + def NotifyFinished(self, *args, **kwargs): + client_thread.notified_finished += 1 + return 1 handle_request_input = HandleRequestInput() import pydev_localhost - print('Starting client with:', pydev_localhost.get_localhost(), self.client_port) - client_server = SimpleXMLRPCServer((pydev_localhost.get_localhost(), self.client_port), logRequests=False) + self.client_server = client_server = SimpleXMLRPCServer((pydev_localhost.get_localhost(), self.client_port), logRequests=False) client_server.register_function(handle_request_input.RequestInput) + client_server.register_function(handle_request_input.NotifyFinished) client_server.serve_forever() - + + def shutdown(self): + return + self.client_server.shutdown() + client_thread = ClientThread(client_port) + client_thread.requested_input = False + client_thread.notified_finished = 0 client_thread.setDaemon(True) client_thread.start() return client_thread @@ -67,6 +69,9 @@ class Test(unittest.TestCase): def testServer(self): + # Just making sure that the singleton is created in this thread. + get_pydev_frontend(get_localhost(), 0) + client_port, server_port = self.getFreeAddresses() class ServerThread(threading.Thread): def __init__(self, client_port, server_port): @@ -84,18 +89,27 @@ class Test(unittest.TestCase): client_thread = self.startClientThread(client_port) #@UnusedVariable - import time - time.sleep(.3) #let's give it some time to start the threads - - import pydev_localhost - server = xmlrpclib.Server('http://%s:%s' % (pydev_localhost.get_localhost(), server_port)) - server.addExec("import sys; print('Running with: %s %s' % (sys.executable or sys.platform, sys.version))") - server.addExec('class Foo:') - server.addExec(' pass') - server.addExec('') - server.addExec('foo = Foo()') - server.addExec('a = %s()' % raw_input_name) - server.addExec('print (a)') + try: + import time + time.sleep(.3) #let's give it some time to start the threads + + import pydev_localhost + server = xmlrpclib.Server('http://%s:%s' % (pydev_localhost.get_localhost(), server_port)) + server.execLine("import sys; print('Running with: %s %s' % (sys.executable or sys.platform, sys.version))") + server.execLine('class Foo:') + server.execLine(' pass') + server.execLine('') + server.execLine('foo = Foo()') + server.execLine('a = %s()' % raw_input_name) + initial = time.time() + while not client_thread.requested_input: + if time.time() - initial > 2: + raise AssertionError('Did not get the return asked before the timeout.') + time.sleep(.1) + frame_xml = server.getFrame() + self.assert_('RequestInput' in frame_xml, 'Did not fid RequestInput in:\n%s' % (frame_xml,)) + finally: + client_thread.shutdown() #======================================================================================================================= # main diff --git a/python/helpers/pydev/tests/test_get_referrers.py b/python/helpers/pydev/tests/test_get_referrers.py index 7fc85142b02e..8284b2779c40 100644 --- a/python/helpers/pydev/tests/test_get_referrers.py +++ b/python/helpers/pydev/tests/test_get_referrers.py @@ -1,21 +1,7 @@ -import os.path import sys import threading import time -IS_JYTHON = sys.platform.find('java') != -1 - -try: - this_file_name = __file__ -except NameError: - # stupid jython. plain old __file__ isnt working for some reason - import test_runfiles #@UnresolvedImport - importing the module itself - this_file_name = test_runfiles.__file__ - - -desired_runfiles_path = os.path.normpath(os.path.dirname(this_file_name) + "/..") -sys.path.insert(0, desired_runfiles_path) - import unittest import pydevd_referrers from pydev_imports import StringIO diff --git a/python/helpers/pydev/tests/test_jyserver.py b/python/helpers/pydev/tests/test_jyserver.py index 8765400ae39d..12be8bcf5b1b 100644 --- a/python/helpers/pydev/tests/test_jyserver.py +++ b/python/helpers/pydev/tests/test_jyserver.py @@ -36,10 +36,15 @@ class Test(unittest.TestCase): unittest.TestCase.tearDown(self) def testIt(self): + if not IS_JYTHON: + return dbg('ok') def testMessage(self): + if not IS_JYTHON: + return t = jycompletionserver.T(0) + t.exit_process_on_kill = False l = [] l.append(('Def', 'description' , 'args')) @@ -65,6 +70,8 @@ class Test(unittest.TestCase): def testCompletionSocketsAndMessages(self): + if not IS_JYTHON: + return dbg('testCompletionSocketsAndMessages') t, socket = self.createConnections() self.socket = socket @@ -121,6 +128,7 @@ class Test(unittest.TestCase): Creates the connections needed for testing. ''' t = jycompletionserver.T(p1) + t.exit_process_on_kill = False t.start() diff --git a/python/helpers/pydev/tests/test_jysimpleTipper.py b/python/helpers/pydev/tests/test_jysimpleTipper.py index 4a755634bdc7..064f8680584a 100644 --- a/python/helpers/pydev/tests/test_jysimpleTipper.py +++ b/python/helpers/pydev/tests/test_jysimpleTipper.py @@ -4,17 +4,14 @@ import unittest import os import sys -#make it as if we were executing from the directory above this one (so that we can use pycompletionserver -#without the need for it being in the pythonpath) -sys.argv[0] = os.path.dirname(sys.argv[0]) -#twice the dirname to get the previous level from this file. -sys.path.insert(1, os.path.join(os.path.dirname(sys.argv[0]))) #this does not work (they must be in the system pythonpath) #sys.path.insert(1, r"D:\bin\eclipse321\plugins\org.junit_3.8.1\junit.jar" ) #some late loading jar tests #sys.path.insert(1, r"D:\bin\eclipse331_1\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant.jar" ) #some late loading jar tests +IS_JYTHON = 0 if sys.platform.find('java') != -1: + IS_JYTHON = 1 from _pydev_jy_imports_tipper import ismethod from _pydev_jy_imports_tipper import isclass from _pydev_jy_imports_tipper import dirObj @@ -234,22 +231,24 @@ class TestCompl(unittest.TestCase): assert isMet[1][0].basicAsStr() == "function:met2 args=['arg1', 'arg2'], varargs=vararg, kwargs=kwarg, docs:docmet2" assert not isclass(met2) + +if not IS_JYTHON: + # Disable tests if not running under Jython + class TestMod(unittest.TestCase): + pass + class TestCompl(TestMod): + pass + class TestSearch(TestMod): + pass if __name__ == '__main__': - if sys.platform.find('java') != -1: - #Only run if jython - suite = unittest.makeSuite(TestCompl) - suite2 = unittest.makeSuite(TestMod) - suite3 = unittest.makeSuite(TestSearch) + #Only run if jython + suite = unittest.makeSuite(TestCompl) + suite2 = unittest.makeSuite(TestMod) + suite3 = unittest.makeSuite(TestSearch) + + unittest.TextTestRunner(verbosity=1).run(suite) + unittest.TextTestRunner(verbosity=1).run(suite2) + unittest.TextTestRunner(verbosity=1).run(suite3) - unittest.TextTestRunner(verbosity=1).run(suite) - unittest.TextTestRunner(verbosity=1).run(suite2) - unittest.TextTestRunner(verbosity=1).run(suite3) - -# suite.addTest(Test('testCase12')) -# suite = unittest.TestSuite() -# unittest.TextTestRunner(verbosity=1).run(suite) - - else: - sys.stdout.write('Not running jython tests for non-java platform: %s' % sys.platform) diff --git a/python/helpers/pydev/tests/test_pydev_ipython_010.py b/python/helpers/pydev/tests/test_pydev_ipython_010.py deleted file mode 100644 index 5ce1dc32c34a..000000000000 --- a/python/helpers/pydev/tests/test_pydev_ipython_010.py +++ /dev/null @@ -1,80 +0,0 @@ -#TODO: This test no longer works (check if it should be fixed or removed altogether). - -#import unittest -#import sys -#import os -##make it as if we were executing from the directory above this one -#sys.argv[0] = os.path.dirname(sys.argv[0]) -##twice the dirname to get the previous level from this file. -#sys.path.insert(1, os.path.join(os.path.dirname(sys.argv[0]))) -# -#from pydev_localhost import get_localhost -# -# -#IS_JYTHON = sys.platform.find('java') != -1 -# -##======================================================================================================================= -## TestCase -##======================================================================================================================= -#class TestCase(unittest.TestCase): -# -# def setUp(self): -# unittest.TestCase.setUp(self) -# -# def tearDown(self): -# unittest.TestCase.tearDown(self) -# -# def testIPython(self): -# try: -# from pydev_ipython_console import PyDevFrontEnd -# except: -# if IS_JYTHON: -# return -# front_end = PyDevFrontEnd(get_localhost(), 0) -# -# front_end.input_buffer = 'if True:' -# self.assert_(not front_end._on_enter()) -# -# front_end.input_buffer = 'if True:\n' + \ -# front_end.continuation_prompt() + ' a = 10\n' -# self.assert_(not front_end._on_enter()) -# -# -# front_end.input_buffer = 'if True:\n' + \ -# front_end.continuation_prompt() + ' a = 10\n\n' -# self.assert_(front_end._on_enter()) -# -# -## front_end.input_buffer = ' print a' -## self.assert_(not front_end._on_enter()) -## front_end.input_buffer = '' -## self.assert_(front_end._on_enter()) -# -# -## front_end.input_buffer = 'a.' -## front_end.complete_current_input() -## front_end.input_buffer = 'if True:' -## front_end._on_enter() -# front_end.input_buffer = 'a = 30' -# front_end._on_enter() -# front_end.input_buffer = 'print a' -# front_end._on_enter() -# front_end.input_buffer = 'a?' -# front_end._on_enter() -# print front_end.complete('%') -# print front_end.complete('%e') -# print front_end.complete('cd c:/t') -# print front_end.complete('cd c:/temp/') -## front_end.input_buffer = 'print raw_input("press enter\\n")' -## front_end._on_enter() -## -# -##======================================================================================================================= -## main -##======================================================================================================================= -#if __name__ == '__main__': -# if sys.platform.find('java') == -1: -# #IPython not available for Jython -# unittest.main() -# else: -# print('not supported on Jython') diff --git a/python/helpers/pydev/tests/test_pydev_ipython_011.py b/python/helpers/pydev/tests/test_pydev_ipython_011.py index 3cfa70fd0112..dc4684f35f3d 100644 --- a/python/helpers/pydev/tests/test_pydev_ipython_011.py +++ b/python/helpers/pydev/tests/test_pydev_ipython_011.py @@ -7,81 +7,87 @@ from pydev_imports import StringIO, SimpleXMLRPCServer from pydev_localhost import get_localhost from pydev_console_utils import StdIn import socket +from pydev_ipython_console_011 import get_pydev_frontend +import time -# make it as if we were executing from the directory above this one -sys.argv[0] = os.path.dirname(sys.argv[0]) -# twice the dirname to get the previous level from this file. -sys.path.insert(1, os.path.join(os.path.dirname(sys.argv[0]))) +try: + xrange +except: + xrange = range -# PyDevFrontEnd depends on singleton in IPython, so you -# can't make multiple versions. So we reuse front_end for -# all the tests - -orig_stdout = sys.stdout -orig_stderr = sys.stderr - -stdout = sys.stdout = StringIO() -stderr = sys.stderr = StringIO() - -from pydev_ipython_console_011 import PyDevFrontEnd -s = socket.socket() -s.bind(('', 0)) -client_port = s.getsockname()[1] -s.close() -front_end = PyDevFrontEnd(get_localhost(), client_port) - - -def addExec(code, expected_more=False): - more = front_end.addExec(code) - eq_(expected_more, more) class TestBase(unittest.TestCase): + + def setUp(self): - front_end.input_splitter.reset() - stdout.truncate(0) - stdout.seek(0) - stderr.truncate(0) - stderr.seek(0) + # PyDevFrontEnd depends on singleton in IPython, so you + # can't make multiple versions. So we reuse self.front_end for + # all the tests + self.front_end = get_pydev_frontend(get_localhost(), 0) + + from pydev_ipython.inputhook import set_return_control_callback + set_return_control_callback(lambda:True) + self.front_end.clearBuffer() + def tearDown(self): pass + + def addExec(self, code, expected_more=False): + more = self.front_end.addExec(code) + eq_(expected_more, more) + + def redirectStdout(self): + from IPython.utils import io + + self.original_stdout = sys.stdout + sys.stdout = io.stdout = StringIO() + + def restoreStdout(self): + from IPython.utils import io + io.stdout = sys.stdout = self.original_stdout class TestPyDevFrontEnd(TestBase): + def testAddExec_1(self): - addExec('if True:', True) + self.addExec('if True:', True) + def testAddExec_2(self): - addExec('if True:\n testAddExec_a = 10\n', True) + #Change: 'more' must now be controlled in the client side after the initial 'True' returned. + self.addExec('if True:\n testAddExec_a = 10\n', False) + assert 'testAddExec_a' in self.front_end.getNamespace() + def testAddExec_3(self): - assert 'testAddExec_a' not in front_end.getNamespace() - addExec('if True:\n testAddExec_a = 10\n\n') - assert 'testAddExec_a' in front_end.getNamespace() - eq_(front_end.getNamespace()['testAddExec_a'], 10) + assert 'testAddExec_x' not in self.front_end.getNamespace() + self.addExec('if True:\n testAddExec_x = 10\n\n') + assert 'testAddExec_x' in self.front_end.getNamespace() + eq_(self.front_end.getNamespace()['testAddExec_x'], 10) def testGetNamespace(self): - assert 'testGetNamespace_a' not in front_end.getNamespace() - addExec('testGetNamespace_a = 10') - assert 'testGetNamespace_a' in front_end.getNamespace() - eq_(front_end.getNamespace()['testGetNamespace_a'], 10) + assert 'testGetNamespace_a' not in self.front_end.getNamespace() + self.addExec('testGetNamespace_a = 10') + assert 'testGetNamespace_a' in self.front_end.getNamespace() + eq_(self.front_end.getNamespace()['testGetNamespace_a'], 10) def testComplete(self): - unused_text, matches = front_end.complete('%') + unused_text, matches = self.front_end.complete('%') assert len(matches) > 1, 'at least one magic should appear in completions' def testCompleteDoesNotDoPythonMatches(self): # Test that IPython's completions do not do the things that # PyDev's completions will handle - addExec('testComplete_a = 5') - addExec('testComplete_b = 10') - addExec('testComplete_c = 15') - unused_text, matches = front_end.complete('testComplete_') + self.addExec('testComplete_a = 5') + self.addExec('testComplete_b = 10') + self.addExec('testComplete_c = 15') + unused_text, matches = self.front_end.complete('testComplete_') assert len(matches) == 0 def testGetCompletions_1(self): # Test the merged completions include the standard completions - addExec('testComplete_a = 5') - addExec('testComplete_b = 10') - addExec('testComplete_c = 15') - res = front_end.getCompletions('testComplete_', 'testComplete_') + self.addExec('testComplete_a = 5') + self.addExec('testComplete_b = 10') + self.addExec('testComplete_c = 15') + res = self.front_end.getCompletions('testComplete_', 'testComplete_') matches = [f[0] for f in res] assert len(matches) == 3 eq_(set(['testComplete_a', 'testComplete_b', 'testComplete_c']), set(matches)) @@ -90,60 +96,80 @@ class TestPyDevFrontEnd(TestBase): # Test that we get IPython completions in results # we do this by checking kw completion which PyDev does # not do by default - addExec('def ccc(ABC=123): pass') - res = front_end.getCompletions('ccc(', '') + self.addExec('def ccc(ABC=123): pass') + res = self.front_end.getCompletions('ccc(', '') matches = [f[0] for f in res] assert 'ABC=' in matches def testGetCompletions_3(self): # Test that magics return IPYTHON magic as type - res = front_end.getCompletions('%cd', '%cd') + res = self.front_end.getCompletions('%cd', '%cd') assert len(res) == 1 eq_(res[0][3], '12') # '12' == IToken.TYPE_IPYTHON_MAGIC assert len(res[0][1]) > 100, 'docstring for %cd should be a reasonably long string' class TestRunningCode(TestBase): def testPrint(self): - addExec('print("output")') - eq_(stdout.getvalue(), 'output\n') + self.redirectStdout() + try: + self.addExec('print("output")') + eq_(sys.stdout.getvalue(), 'output\n') + finally: + self.restoreStdout() def testQuestionMark_1(self): - addExec('?') - assert len(stdout.getvalue()) > 1000, 'IPython help should be pretty big' + self.redirectStdout() + try: + self.addExec('?') + assert len(sys.stdout.getvalue()) > 1000, 'IPython help should be pretty big' + finally: + self.restoreStdout() def testQuestionMark_2(self): - addExec('int?') - assert stdout.getvalue().find('Convert') != -1 + self.redirectStdout() + try: + self.addExec('int?') + assert sys.stdout.getvalue().find('Convert') != -1 + finally: + self.restoreStdout() def testGui(self): - from pydev_ipython.inputhook import get_inputhook, set_stdin_file - set_stdin_file(sys.stdin) - assert get_inputhook() is None - addExec('%gui tk') - # we can't test the GUI works here because we aren't connected to XML-RPC so - # nowhere for hook to run - assert get_inputhook() is not None - addExec('%gui none') - assert get_inputhook() is None + try: + import Tkinter + except: + return + else: + from pydev_ipython.inputhook import get_inputhook + assert get_inputhook() is None + self.addExec('%gui tk') + # we can't test the GUI works here because we aren't connected to XML-RPC so + # nowhere for hook to run + assert get_inputhook() is not None + self.addExec('%gui none') + assert get_inputhook() is None def testHistory(self): ''' Make sure commands are added to IPython's history ''' - addExec('a=1') - addExec('b=2') - _ih = front_end.getNamespace()['_ih'] - eq_(_ih[-1], 'b=2') - eq_(_ih[-2], 'a=1') - - addExec('history') - hist = stdout.getvalue().split('\n') - eq_(hist[-1], '') - eq_(hist[-2], 'history') - eq_(hist[-3], 'b=2') - eq_(hist[-4], 'a=1') + self.redirectStdout() + try: + self.addExec('a=1') + self.addExec('b=2') + _ih = self.front_end.getNamespace()['_ih'] + eq_(_ih[-1], 'b=2') + eq_(_ih[-2], 'a=1') + + self.addExec('history') + hist = sys.stdout.getvalue().split('\n') + eq_(hist[-1], '') + eq_(hist[-2], 'history') + eq_(hist[-3], 'b=2') + eq_(hist[-4], 'a=1') + finally: + self.restoreStdout() def testEdit(self): - ''' Make sure we can issue an edit command ''' + ''' Make sure we can issue an edit command''' called_RequestInput = [False] called_IPythonEditor = [False] def startClientThread(client_port): @@ -163,26 +189,47 @@ class TestRunningCode(TestBase): handle_request_input = HandleRequestInput() import pydev_localhost - client_server = SimpleXMLRPCServer((pydev_localhost.get_localhost(), self.client_port), logRequests=False) + self.client_server = client_server = SimpleXMLRPCServer( + (pydev_localhost.get_localhost(), self.client_port), logRequests=False) client_server.register_function(handle_request_input.RequestInput) client_server.register_function(handle_request_input.IPythonEditor) client_server.serve_forever() + + def shutdown(self): + return + self.client_server.shutdown() client_thread = ClientThread(client_port) client_thread.setDaemon(True) client_thread.start() return client_thread - startClientThread(client_port) + # PyDevFrontEnd depends on singleton in IPython, so you + # can't make multiple versions. So we reuse self.front_end for + # all the tests + s = socket.socket() + s.bind(('', 0)) + self.client_port = client_port = s.getsockname()[1] + s.close() + self.front_end = get_pydev_frontend(get_localhost(), client_port) + + client_thread = startClientThread(self.client_port) orig_stdin = sys.stdin - sys.stdin = StdIn(self, get_localhost(), client_port) + sys.stdin = StdIn(self, get_localhost(), self.client_port) try: filename = 'made_up_file.py' - addExec('%edit ' + filename) - eq_(called_IPythonEditor[0], (os.path.abspath(filename), 0)) + self.addExec('%edit ' + filename) + + for i in xrange(10): + if called_IPythonEditor[0] == (os.path.abspath(filename), '0'): + break + time.sleep(.1) + + eq_(called_IPythonEditor[0], (os.path.abspath(filename), '0')) assert called_RequestInput[0], "Make sure the 'wait' parameter has been respected" finally: sys.stdin = orig_stdin + client_thread.shutdown() if __name__ == '__main__': diff --git a/python/helpers/pydev/tests/test_pydevconsole.py b/python/helpers/pydev/tests/test_pydevconsole.py index 9a9e3edaf124..18421980ae82 100644 --- a/python/helpers/pydev/tests/test_pydevconsole.py +++ b/python/helpers/pydev/tests/test_pydevconsole.py @@ -1,10 +1,6 @@ import threading import unittest import sys -import os - -sys.argv[0] = os.path.dirname(sys.argv[0]) -sys.path.insert(1, os.path.join(os.path.dirname(sys.argv[0]))) import pydevconsole from pydev_imports import xmlrpclib, SimpleXMLRPCServer, StringIO @@ -19,104 +15,112 @@ except NameError: #======================================================================================================================= class Test(unittest.TestCase): - def setUp(self): + def testConsoleHello(self): self.original_stdout = sys.stdout sys.stdout = StringIO() - - - def tearDown(self): - ret = sys.stdout #@UnusedVariable - sys.stdout = self.original_stdout - #print_ ret.getvalue() -- use to see test output - - def testConsoleHello(self): - client_port, _server_port = self.getFreeAddresses() - client_thread = self.startClientThread(client_port) #@UnusedVariable - import time - time.sleep(.3) #let's give it some time to start the threads - - import pydev_localhost - interpreter = pydevconsole.InterpreterInterface(pydev_localhost.get_localhost(), client_port, server=None) - - (result,) = interpreter.hello("Hello pydevconsole") - self.assertEqual(result, "Hello eclipse") + + try: + client_port, _server_port = self.getFreeAddresses() + client_thread = self.startClientThread(client_port) #@UnusedVariable + import time + time.sleep(.3) #let's give it some time to start the threads + + import pydev_localhost + interpreter = pydevconsole.InterpreterInterface(pydev_localhost.get_localhost(), client_port, threading.currentThread()) + + (result,) = interpreter.hello("Hello pydevconsole") + self.assertEqual(result, "Hello eclipse") + finally: + sys.stdout = self.original_stdout def testConsoleRequests(self): - client_port, _server_port = self.getFreeAddresses() - client_thread = self.startClientThread(client_port) #@UnusedVariable - import time - time.sleep(.3) #let's give it some time to start the threads - - import pydev_localhost - interpreter = pydevconsole.InterpreterInterface(pydev_localhost.get_localhost(), client_port, server=None) - interpreter.addExec('class Foo:') - interpreter.addExec(' CONSTANT=1') - interpreter.addExec('') - interpreter.addExec('foo=Foo()') - interpreter.addExec('foo.__doc__=None') - interpreter.addExec('val = %s()' % (raw_input_name,)) - interpreter.addExec('50') - interpreter.addExec('print (val)') - found = sys.stdout.getvalue().split() + self.original_stdout = sys.stdout + sys.stdout = StringIO() + try: - self.assertEqual(['50', 'input_request'], found) - except: - self.assertEqual(['input_request'], found) #IPython - - comps = interpreter.getCompletions('foo.', 'foo.') - self.assert_( - ('CONSTANT', '', '', '3') in comps or ('CONSTANT', '', '', '4') in comps, \ - 'Found: %s' % comps - ) - - comps = interpreter.getCompletions('"".', '"".') - self.assert_( - ('__add__', 'x.__add__(y) <==> x+y', '', '3') in comps or - ('__add__', '', '', '4') in comps or - ('__add__', 'x.__add__(y) <==> x+y\r\nx.__add__(y) <==> x+y', '()', '2') in comps or - ('__add__', 'x.\n__add__(y) <==> x+yx.\n__add__(y) <==> x+y', '()', '2'), - 'Did not find __add__ in : %s' % (comps,) - ) - - - completions = interpreter.getCompletions('', '') - for c in completions: - if c[0] == 'AssertionError': - break - else: - self.fail('Could not find AssertionError') - - completions = interpreter.getCompletions('Assert', 'Assert') - for c in completions: - if c[0] == 'RuntimeError': - self.fail('Did not expect to find RuntimeError there') - - self.assert_(('__doc__', None, '', '3') not in interpreter.getCompletions('foo.CO', 'foo.')) - - comps = interpreter.getCompletions('va', 'va') - self.assert_(('val', '', '', '3') in comps or ('val', '', '', '4') in comps) - - interpreter.addExec('s = "mystring"') - - desc = interpreter.getDescription('val') - self.assert_(desc.find('str(object) -> string') >= 0 or - desc == "'input_request'" or - desc.find('str(string[, encoding[, errors]]) -> str') >= 0 or - desc.find('str(Char* value)') >= 0 or - desc.find('str(value: Char*)') >= 0, - 'Could not find what was needed in %s' % desc) - - desc = interpreter.getDescription('val.join') - self.assert_(desc.find('S.join(sequence) -> string') >= 0 or - desc.find('S.join(sequence) -> str') >= 0 or - desc.find('S.join(iterable) -> string') >= 0 or - desc == "" or - desc == "" or - desc.find('str join(str self, list sequence)') >= 0 or - desc.find('S.join(iterable) -> str') >= 0 or - desc.find('join(self: str, sequence: list) -> str') >= 0, - "Could not recognize: %s" % (desc,)) + client_port, _server_port = self.getFreeAddresses() + client_thread = self.startClientThread(client_port) #@UnusedVariable + import time + time.sleep(.3) #let's give it some time to start the threads + + import pydev_localhost + from pydev_console_utils import CodeFragment + + interpreter = pydevconsole.InterpreterInterface(pydev_localhost.get_localhost(), client_port, threading.currentThread()) + sys.stdout = StringIO() + interpreter.addExec(CodeFragment('class Foo:')) + interpreter.addExec(CodeFragment(' CONSTANT=1')) + interpreter.addExec(CodeFragment('')) + interpreter.addExec(CodeFragment('foo=Foo()')) + interpreter.addExec(CodeFragment('foo.__doc__=None')) + interpreter.addExec(CodeFragment('val = %s()' % (raw_input_name,))) + interpreter.addExec(CodeFragment('50')) + interpreter.addExec(CodeFragment('print (val)')) + found = sys.stdout.getvalue().split() + try: + self.assertEqual(['50', 'input_request'], found) + except: + self.assertEqual(['input_request'], found) #IPython + + comps = interpreter.getCompletions('foo.', 'foo.') + self.assert_( + ('CONSTANT', '', '', '3') in comps or ('CONSTANT', '', '', '4') in comps, \ + 'Found: %s' % comps + ) + + comps = interpreter.getCompletions('"".', '"".') + self.assert_( + ('__add__', 'x.__add__(y) <==> x+y', '', '3') in comps or + ('__add__', '', '', '4') in comps or + ('__add__', 'x.__add__(y) <==> x+y\r\nx.__add__(y) <==> x+y', '()', '2') in comps or + ('__add__', 'x.\n__add__(y) <==> x+yx.\n__add__(y) <==> x+y', '()', '2'), + 'Did not find __add__ in : %s' % (comps,) + ) + + + completions = interpreter.getCompletions('', '') + for c in completions: + if c[0] == 'AssertionError': + break + else: + self.fail('Could not find AssertionError') + + completions = interpreter.getCompletions('Assert', 'Assert') + for c in completions: + if c[0] == 'RuntimeError': + self.fail('Did not expect to find RuntimeError there') + + self.assert_(('__doc__', None, '', '3') not in interpreter.getCompletions('foo.CO', 'foo.')) + + comps = interpreter.getCompletions('va', 'va') + self.assert_(('val', '', '', '3') in comps or ('val', '', '', '4') in comps) + + interpreter.addExec(CodeFragment('s = "mystring"')) + + desc = interpreter.getDescription('val') + self.assert_(desc.find('str(object) -> string') >= 0 or + desc == "'input_request'" or + desc.find('str(string[, encoding[, errors]]) -> str') >= 0 or + desc.find('str(Char* value)') >= 0 or + desc.find('str(object=\'\') -> string') >= 0 or + desc.find('str(value: Char*)') >= 0 or + desc.find('str(object=\'\') -> str') >= 0 + , + 'Could not find what was needed in %s' % desc) + + desc = interpreter.getDescription('val.join') + self.assert_(desc.find('S.join(sequence) -> string') >= 0 or + desc.find('S.join(sequence) -> str') >= 0 or + desc.find('S.join(iterable) -> string') >= 0 or + desc == "" or + desc == "" or + desc.find('str join(str self, list sequence)') >= 0 or + desc.find('S.join(iterable) -> str') >= 0 or + desc.find('join(self: str, sequence: list) -> str') >= 0, + "Could not recognize: %s" % (desc,)) + finally: + sys.stdout = self.original_stdout def startClientThread(self, client_port): @@ -124,19 +128,28 @@ class Test(unittest.TestCase): def __init__(self, client_port): threading.Thread.__init__(self) self.client_port = client_port + def run(self): class HandleRequestInput: def RequestInput(self): + client_thread.requested_input = True return 'input_request' - + + def NotifyFinished(self, *args, **kwargs): + client_thread.notified_finished += 1 + return 1 + handle_request_input = HandleRequestInput() - + import pydev_localhost client_server = SimpleXMLRPCServer((pydev_localhost.get_localhost(), self.client_port), logRequests=False) client_server.register_function(handle_request_input.RequestInput) + client_server.register_function(handle_request_input.NotifyFinished) client_server.serve_forever() - + client_thread = ClientThread(client_port) + client_thread.requested_input = False + client_thread.notified_finished = 0 client_thread.setDaemon(True) client_thread.start() return client_thread @@ -194,34 +207,50 @@ class Test(unittest.TestCase): def testServer(self): - client_port, server_port = self.getFreeAddresses() - class ServerThread(threading.Thread): - def __init__(self, client_port, server_port): - threading.Thread.__init__(self) - self.client_port = client_port - self.server_port = server_port - - def run(self): - import pydev_localhost - pydevconsole.StartServer(pydev_localhost.get_localhost(), self.server_port, self.client_port) - server_thread = ServerThread(client_port, server_port) - server_thread.setDaemon(True) - server_thread.start() - - client_thread = self.startClientThread(client_port) #@UnusedVariable - - import time - time.sleep(.3) #let's give it some time to start the threads - - import pydev_localhost - server = xmlrpclib.Server('http://%s:%s' % (pydev_localhost.get_localhost(), server_port)) - server.addExec('class Foo:') - server.addExec(' pass') - server.addExec('') - server.addExec('foo = Foo()') - server.addExec('a = %s()' % (raw_input_name,)) - server.addExec('print (a)') - self.assertEqual(['input_request'], sys.stdout.getvalue().split()) + self.original_stdout = sys.stdout + sys.stdout = StringIO() + try: + client_port, server_port = self.getFreeAddresses() + class ServerThread(threading.Thread): + def __init__(self, client_port, server_port): + threading.Thread.__init__(self) + self.client_port = client_port + self.server_port = server_port + + def run(self): + import pydev_localhost + pydevconsole.StartServer(pydev_localhost.get_localhost(), self.server_port, self.client_port) + server_thread = ServerThread(client_port, server_port) + server_thread.setDaemon(True) + server_thread.start() + + client_thread = self.startClientThread(client_port) #@UnusedVariable + + import time + time.sleep(.3) #let's give it some time to start the threads + sys.stdout = StringIO() + + import pydev_localhost + server = xmlrpclib.Server('http://%s:%s' % (pydev_localhost.get_localhost(), server_port)) + server.execLine('class Foo:') + server.execLine(' pass') + server.execLine('') + server.execLine('foo = Foo()') + server.execLine('a = %s()' % (raw_input_name,)) + server.execLine('print (a)') + initial = time.time() + while not client_thread.requested_input: + if time.time() - initial > 2: + raise AssertionError('Did not get the return asked before the timeout.') + time.sleep(.1) + + while ['input_request'] != sys.stdout.getvalue().split(): + if time.time() - initial > 2: + break + time.sleep(.1) + self.assertEqual(['input_request'], sys.stdout.getvalue().split()) + finally: + sys.stdout = self.original_stdout #======================================================================================================================= # main diff --git a/python/helpers/pydev/tests/test_pyserver.py b/python/helpers/pydev/tests/test_pyserver.py index a74876b8c8b9..ea9daff14e39 100644 --- a/python/helpers/pydev/tests/test_pyserver.py +++ b/python/helpers/pydev/tests/test_pyserver.py @@ -3,6 +3,7 @@ ''' import sys import os +from _pydev_imps._pydev_thread import start_new_thread #make it as if we were executing from the directory above this one (so that we can use pycompletionserver #without the need for it being in the pythonpath) @@ -13,6 +14,13 @@ sys.path.insert(1, os.path.join(os.path.dirname(sys.argv[0]))) IS_PYTHON_3K = 0 if sys.platform.find('java') == -1: + try: + import __builtin__ #@UnusedImport + BUILTIN_MOD = '__builtin__' + except ImportError: + BUILTIN_MOD = 'builtins' + + try: import inspect @@ -41,7 +49,7 @@ if sys.platform.find('java') == -1: unittest.TestCase.tearDown(self) def testMessage(self): - t = pycompletionserver.T(0) + t = pycompletionserver.CompletionServer(0) l = [] l.append(('Def', 'description' , 'args')) @@ -62,14 +70,14 @@ if sys.platform.find('java') == -1: ''' Creates the connections needed for testing. ''' - t = pycompletionserver.T(p1) - - t.start() - server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((pycompletionserver.HOST, p1)) server.listen(1) #socket to receive messages. + t = pycompletionserver.CompletionServer(p1) + t.exit_process_on_kill = False + start_new_thread(t.run, ()) + s, addr = server.accept() return t, s @@ -106,6 +114,8 @@ if sys.platform.find('java') == -1: #math is a builtin and because of that, it starts with None as a file start = '@@COMPLETIONS(None,(__doc__,' start_2 = '@@COMPLETIONS(None,(__name__,' + if '/math.so,' in completions or '/math.cpython-33m.so,' in completions or '/math.cpython-34m.so,' in completions: + return self.assert_(completions.startswith(start) or completions.startswith(start_2), '%s DOESNT START WITH %s' % (completions, (start, start_2))) self.assert_('@@COMPLETIONS' in completions) @@ -113,7 +123,7 @@ if sys.platform.find('java') == -1: #now, test i - msg = quote_plus('__builtin__.list') + msg = quote_plus('%s.list' % BUILTIN_MOD) send(socket, "@@IMPORTS:%s\nEND@@" % msg) found = self.readMsg() self.assert_('sort' in found, 'Could not find sort in: %s' % (found,)) diff --git a/python/helpers/pydev/tests/test_simpleTipper.py b/python/helpers/pydev/tests/test_simpleTipper.py index f759ad60f678..255a5218698f 100644 --- a/python/helpers/pydev/tests/test_simpleTipper.py +++ b/python/helpers/pydev/tests/test_simpleTipper.py @@ -1,12 +1,7 @@ ''' @author Fabio Zadrozny ''' -import os import sys -#make it as if we were executing from the directory above this one (so that we can use pycompletionserver -#without the need for it being in the pythonpath) -#twice the dirname to get the previous level from this file. -sys.path.insert(1, os.path.split(os.path.split(__file__)[0])[0]) try: import __builtin__ #@UnusedImport @@ -50,13 +45,14 @@ if sys.platform.find('java') == -1: pass def testImports5(self): - tip = _pydev_imports_tipper.GenerateTip('__builtin__.list') + tip = _pydev_imports_tipper.GenerateTip('%s.list' % BUILTIN_MOD) s = self.assertIn('sort', tip) self.CheckArgs( s, '(cmp=None, key=None, reverse=False)', '(self, object cmp, object key, bool reverse)', - '(self, cmp: object, key: object, reverse: bool)' + '(self, cmp: object, key: object, reverse: bool)', + '(key=None, reverse=False)', ) def testImports2a(self): @@ -64,14 +60,24 @@ if sys.platform.find('java') == -1: self.assertIn('__doc__', tips) def testImports2b(self): - tips = _pydev_imports_tipper.GenerateTip('%s' % BUILTIN_MOD) - t = self.assertIn('file' , tips) - self.assert_('->' in t[1].strip() or 'file' in t[1]) + try: + file + except: + pass + else: + tips = _pydev_imports_tipper.GenerateTip('%s' % BUILTIN_MOD) + t = self.assertIn('file' , tips) + self.assert_('->' in t[1].strip() or 'file' in t[1]) def testImports2c(self): - tips = _pydev_imports_tipper.GenerateTip('%s.file' % BUILTIN_MOD) - t = self.assertIn('readlines' , tips) - self.assert_('->' in t[1] or 'sizehint' in t[1]) + try: + file # file is not available on py 3 + except: + pass + else: + tips = _pydev_imports_tipper.GenerateTip('%s.file' % BUILTIN_MOD) + t = self.assertIn('readlines' , tips) + self.assert_('->' in t[1] or 'sizehint' in t[1]) def testImports(self): ''' @@ -110,9 +116,9 @@ if sys.platform.find('java') == -1: self.assertIn('RuntimeError' , tip) self.assertIn('RuntimeWarning' , tip) - t = self.assertIn('cmp' , tip) - - self.CheckArgs(t, '(x, y)', '(object x, object y)', '(x: object, y: object)') #args + # Remove cmp as it's not available on py 3 + #t = self.assertIn('cmp' , tip) + #self.CheckArgs(t, '(x, y)', '(object x, object y)', '(x: object, y: object)') #args t = self.assertIn('isinstance' , tip) self.CheckArgs(t, '(object, class_or_type_or_tuple)', '(object o, type typeinfo)', '(o: object, typeinfo: type)') #args diff --git a/python/helpers/pydev/tests_mainloop/gui-glut.py b/python/helpers/pydev/tests_mainloop/gui-glut.py index f05a4bc0beaf..34a16b454171 100644 --- a/python/helpers/pydev/tests_mainloop/gui-glut.py +++ b/python/helpers/pydev/tests_mainloop/gui-glut.py @@ -9,42 +9,44 @@ To run this: 4) run: gl.glClearColor(1,1,1,1) """ -#!/usr/bin/env python -import sys -import OpenGL.GL as gl -import OpenGL.GLUT as glut +if __name__ == '__main__': -def close(): - glut.glutDestroyWindow(glut.glutGetWindow()) - -def display(): - gl.glClear (gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT) - glut.glutSwapBuffers() - -def resize(width,height): - gl.glViewport(0, 0, width, height+4) - gl.glMatrixMode(gl.GL_PROJECTION) - gl.glLoadIdentity() - gl.glOrtho(0, width, 0, height+4, -1, 1) - gl.glMatrixMode(gl.GL_MODELVIEW) - -if glut.glutGetWindow() > 0: - interactive = True - glut.glutInit(sys.argv) - glut.glutInitDisplayMode(glut.GLUT_DOUBLE | - glut.GLUT_RGBA | - glut.GLUT_DEPTH) -else: - interactive = False - -glut.glutCreateWindow('gui-glut') -glut.glutDisplayFunc(display) -glut.glutReshapeFunc(resize) -# This is necessary on osx to be able to close the window -# (else the close button is disabled) -if sys.platform == 'darwin' and not bool(glut.HAVE_FREEGLUT): - glut.glutWMCloseFunc(close) -gl.glClearColor(0,0,0,1) - -if not interactive: - glut.glutMainLoop() + #!/usr/bin/env python + import sys + import OpenGL.GL as gl + import OpenGL.GLUT as glut + + def close(): + glut.glutDestroyWindow(glut.glutGetWindow()) + + def display(): + gl.glClear (gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT) + glut.glutSwapBuffers() + + def resize(width,height): + gl.glViewport(0, 0, width, height+4) + gl.glMatrixMode(gl.GL_PROJECTION) + gl.glLoadIdentity() + gl.glOrtho(0, width, 0, height+4, -1, 1) + gl.glMatrixMode(gl.GL_MODELVIEW) + + if glut.glutGetWindow() > 0: + interactive = True + glut.glutInit(sys.argv) + glut.glutInitDisplayMode(glut.GLUT_DOUBLE | + glut.GLUT_RGBA | + glut.GLUT_DEPTH) + else: + interactive = False + + glut.glutCreateWindow('gui-glut') + glut.glutDisplayFunc(display) + glut.glutReshapeFunc(resize) + # This is necessary on osx to be able to close the window + # (else the close button is disabled) + if sys.platform == 'darwin' and not bool(glut.HAVE_FREEGLUT): + glut.glutWMCloseFunc(close) + gl.glClearColor(0,0,0,1) + + if not interactive: + glut.glutMainLoop() diff --git a/python/helpers/pydev/tests_mainloop/gui-gtk.py b/python/helpers/pydev/tests_mainloop/gui-gtk.py index 978f8f9a25f3..6df5c782e96a 100644 --- a/python/helpers/pydev/tests_mainloop/gui-gtk.py +++ b/python/helpers/pydev/tests_mainloop/gui-gtk.py @@ -8,27 +8,28 @@ To run this: interactive console """ -import pygtk -pygtk.require('2.0') -import gtk - - -def hello_world(wigdet, data=None): - print("Hello World") - -def delete_event(widget, event, data=None): - return False - -def destroy(widget, data=None): - gtk.main_quit() - -window = gtk.Window(gtk.WINDOW_TOPLEVEL) -window.connect("delete_event", delete_event) -window.connect("destroy", destroy) -button = gtk.Button("Hello World") -button.connect("clicked", hello_world, None) - -window.add(button) -button.show() -window.show() - +if __name__ == '__main__': + import pygtk + pygtk.require('2.0') + import gtk + + + def hello_world(wigdet, data=None): + print("Hello World") + + def delete_event(widget, event, data=None): + return False + + def destroy(widget, data=None): + gtk.main_quit() + + window = gtk.Window(gtk.WINDOW_TOPLEVEL) + window.connect("delete_event", delete_event) + window.connect("destroy", destroy) + button = gtk.Button("Hello World") + button.connect("clicked", hello_world, None) + + window.add(button) + button.show() + window.show() + diff --git a/python/helpers/pydev/tests_mainloop/gui-gtk3.py b/python/helpers/pydev/tests_mainloop/gui-gtk3.py index a787f7ee9e65..6351d5235ded 100644 --- a/python/helpers/pydev/tests_mainloop/gui-gtk3.py +++ b/python/helpers/pydev/tests_mainloop/gui-gtk3.py @@ -8,25 +8,26 @@ To run this: interactive console """ -from gi.repository import Gtk - - -def hello_world(wigdet, data=None): - print("Hello World") - -def delete_event(widget, event, data=None): - return False - -def destroy(widget, data=None): - Gtk.main_quit() - -window = Gtk.Window(Gtk.WindowType.TOPLEVEL) -window.connect("delete_event", delete_event) -window.connect("destroy", destroy) -button = Gtk.Button("Hello World") -button.connect("clicked", hello_world, None) - -window.add(button) -button.show() -window.show() - +if __name__ == '__main__': + from gi.repository import Gtk + + + def hello_world(wigdet, data=None): + print("Hello World") + + def delete_event(widget, event, data=None): + return False + + def destroy(widget, data=None): + Gtk.main_quit() + + window = Gtk.Window(Gtk.WindowType.TOPLEVEL) + window.connect("delete_event", delete_event) + window.connect("destroy", destroy) + button = Gtk.Button("Hello World") + button.connect("clicked", hello_world, None) + + window.add(button) + button.show() + window.show() + diff --git a/python/helpers/pydev/tests_mainloop/gui-pyglet.py b/python/helpers/pydev/tests_mainloop/gui-pyglet.py index b646093e0967..70f1a7f64724 100644 --- a/python/helpers/pydev/tests_mainloop/gui-pyglet.py +++ b/python/helpers/pydev/tests_mainloop/gui-pyglet.py @@ -8,20 +8,21 @@ To run this: interactive console """ -import pyglet - - -window = pyglet.window.Window() -label = pyglet.text.Label('Hello, world', - font_name='Times New Roman', - font_size=36, - x=window.width//2, y=window.height//2, - anchor_x='center', anchor_y='center') -@window.event -def on_close(): - window.close() - -@window.event -def on_draw(): - window.clear() - label.draw() +if __name__ == '__main__': + import pyglet + + + window = pyglet.window.Window() + label = pyglet.text.Label('Hello, world', + font_name='Times New Roman', + font_size=36, + x=window.width//2, y=window.height//2, + anchor_x='center', anchor_y='center') + @window.event + def on_close(): + window.close() + + @window.event + def on_draw(): + window.clear() + label.draw() diff --git a/python/helpers/pydev/tests_mainloop/gui-qt.py b/python/helpers/pydev/tests_mainloop/gui-qt.py index c27cbd6ff1e6..398310d99662 100644 --- a/python/helpers/pydev/tests_mainloop/gui-qt.py +++ b/python/helpers/pydev/tests_mainloop/gui-qt.py @@ -10,26 +10,26 @@ To run this: Ref: Modified from http://zetcode.com/tutorials/pyqt4/firstprograms/ """ -import sys -from PyQt4 import QtGui, QtCore - -class SimpleWindow(QtGui.QWidget): - def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) - - self.setGeometry(300, 300, 200, 80) - self.setWindowTitle('Hello World') - - quit = QtGui.QPushButton('Close', self) - quit.setGeometry(10, 10, 60, 35) - - self.connect(quit, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('close()')) - if __name__ == '__main__': - app = QtCore.QCoreApplication.instance() - if app is None: - app = QtGui.QApplication([]) - - sw = SimpleWindow() - sw.show() + from PyQt4 import QtGui, QtCore + + class SimpleWindow(QtGui.QWidget): + def __init__(self, parent=None): + QtGui.QWidget.__init__(self, parent) + + self.setGeometry(300, 300, 200, 80) + self.setWindowTitle('Hello World') + + quit = QtGui.QPushButton('Close', self) + quit.setGeometry(10, 10, 60, 35) + + self.connect(quit, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('close()')) + + if __name__ == '__main__': + app = QtCore.QCoreApplication.instance() + if app is None: + app = QtGui.QApplication([]) + + sw = SimpleWindow() + sw.show() diff --git a/python/helpers/pydev/tests_mainloop/gui-tk.py b/python/helpers/pydev/tests_mainloop/gui-tk.py index 69ceb0b9f053..4cef45f91a4a 100644 --- a/python/helpers/pydev/tests_mainloop/gui-tk.py +++ b/python/helpers/pydev/tests_mainloop/gui-tk.py @@ -8,24 +8,26 @@ To run this: interactive console """ -try: - from Tkinter import * -except: - # Python 3 - from tkinter import * - -class MyApp: - - def __init__(self, root): - frame = Frame(root) - frame.pack() - - self.button = Button(frame, text="Hello", command=self.hello_world) - self.button.pack(side=LEFT) - - def hello_world(self): - print("Hello World!") - -root = Tk() - -app = MyApp(root) +if __name__ == '__main__': + + try: + from Tkinter import * + except: + # Python 3 + from tkinter import * + + class MyApp: + + def __init__(self, root): + frame = Frame(root) + frame.pack() + + self.button = Button(frame, text="Hello", command=self.hello_world) + self.button.pack(side=LEFT) + + def hello_world(self): + print("Hello World!") + + root = Tk() + + app = MyApp(root) diff --git a/python/helpers/pydev/tests_mainloop/gui-wx.py b/python/helpers/pydev/tests_mainloop/gui-wx.py index 2101e7f214d4..b9c28bfc63ab 100644 --- a/python/helpers/pydev/tests_mainloop/gui-wx.py +++ b/python/helpers/pydev/tests_mainloop/gui-wx.py @@ -11,91 +11,93 @@ To run this: Ref: Modified from wxPython source code wxPython/samples/simple/simple.py """ -import wx - - -class MyFrame(wx.Frame): - """ - This is MyFrame. It just shows a few controls on a wxPanel, - and has a simple menu. - """ - def __init__(self, parent, title): - wx.Frame.__init__(self, parent, -1, title, - pos=(150, 150), size=(350, 200)) - - # Create the menubar - menuBar = wx.MenuBar() - - # and a menu - menu = wx.Menu() - - # add an item to the menu, using \tKeyName automatically - # creates an accelerator, the third param is some help text - # that will show up in the statusbar - menu.Append(wx.ID_EXIT, "E&xit\tAlt-X", "Exit this simple sample") - - # bind the menu event to an event handler - self.Bind(wx.EVT_MENU, self.OnTimeToClose, id=wx.ID_EXIT) - - # and put the menu on the menubar - menuBar.Append(menu, "&File") - self.SetMenuBar(menuBar) - - self.CreateStatusBar() - - # Now create the Panel to put the other controls on. - panel = wx.Panel(self) - - # and a few controls - text = wx.StaticText(panel, -1, "Hello World!") - text.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD)) - text.SetSize(text.GetBestSize()) - btn = wx.Button(panel, -1, "Close") - funbtn = wx.Button(panel, -1, "Just for fun...") - - # bind the button events to handlers - self.Bind(wx.EVT_BUTTON, self.OnTimeToClose, btn) - self.Bind(wx.EVT_BUTTON, self.OnFunButton, funbtn) - - # Use a sizer to layout the controls, stacked vertically and with - # a 10 pixel border around each - sizer = wx.BoxSizer(wx.VERTICAL) - sizer.Add(text, 0, wx.ALL, 10) - sizer.Add(btn, 0, wx.ALL, 10) - sizer.Add(funbtn, 0, wx.ALL, 10) - panel.SetSizer(sizer) - panel.Layout() - - - def OnTimeToClose(self, evt): - """Event handler for the button click.""" - print("See ya later!") - self.Close() - - def OnFunButton(self, evt): - """Event handler for the button click.""" - print("Having fun yet?") - - -class MyApp(wx.App): - def OnInit(self): - frame = MyFrame(None, "Simple wxPython App") - self.SetTopWindow(frame) - - print("Print statements go to this stdout window by default.") - - frame.Show(True) - return True - - if __name__ == '__main__': - app = wx.GetApp() - if app is None: - app = MyApp(redirect=False, clearSigInt=False) - else: - frame = MyFrame(None, "Simple wxPython App") - app.SetTopWindow(frame) - print("Print statements go to this stdout window by default.") - frame.Show(True) - + import wx + + + class MyFrame(wx.Frame): + """ + This is MyFrame. It just shows a few controls on a wxPanel, + and has a simple menu. + """ + def __init__(self, parent, title): + wx.Frame.__init__(self, parent, -1, title, + pos=(150, 150), size=(350, 200)) + + # Create the menubar + menuBar = wx.MenuBar() + + # and a menu + menu = wx.Menu() + + # add an item to the menu, using \tKeyName automatically + # creates an accelerator, the third param is some help text + # that will show up in the statusbar + menu.Append(wx.ID_EXIT, "E&xit\tAlt-X", "Exit this simple sample") + + # bind the menu event to an event handler + self.Bind(wx.EVT_MENU, self.OnTimeToClose, id=wx.ID_EXIT) + + # and put the menu on the menubar + menuBar.Append(menu, "&File") + self.SetMenuBar(menuBar) + + self.CreateStatusBar() + + # Now create the Panel to put the other controls on. + panel = wx.Panel(self) + + # and a few controls + text = wx.StaticText(panel, -1, "Hello World!") + text.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD)) + text.SetSize(text.GetBestSize()) + btn = wx.Button(panel, -1, "Close") + funbtn = wx.Button(panel, -1, "Just for fun...") + + # bind the button events to handlers + self.Bind(wx.EVT_BUTTON, self.OnTimeToClose, btn) + self.Bind(wx.EVT_BUTTON, self.OnFunButton, funbtn) + + # Use a sizer to layout the controls, stacked vertically and with + # a 10 pixel border around each + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(text, 0, wx.ALL, 10) + sizer.Add(btn, 0, wx.ALL, 10) + sizer.Add(funbtn, 0, wx.ALL, 10) + panel.SetSizer(sizer) + panel.Layout() + + + def OnTimeToClose(self, evt): + """Event handler for the button click.""" + print("See ya later!") + self.Close() + + def OnFunButton(self, evt): + """Event handler for the button click.""" + print("Having fun yet?") + + + class MyApp(wx.App): + def OnInit(self): + frame = MyFrame(None, "Simple wxPython App") + self.SetTopWindow(frame) + + print("Print statements go to this stdout window by default.") + + frame.Show(True) + return True + + + if __name__ == '__main__': + + app = wx.GetApp() + if app is None: + app = MyApp(redirect=False, clearSigInt=False) + else: + frame = MyFrame(None, "Simple wxPython App") + app.SetTopWindow(frame) + print("Print statements go to this stdout window by default.") + frame.Show(True) + diff --git a/python/helpers/pydev/tests_python/_debugger_case18.py b/python/helpers/pydev/tests_python/_debugger_case18.py index 69717b2411ee..06948019611d 100644 --- a/python/helpers/pydev/tests_python/_debugger_case18.py +++ b/python/helpers/pydev/tests_python/_debugger_case18.py @@ -6,7 +6,7 @@ def m2(a): c = 30 def function2(): - print a + print(a) return a diff --git a/python/helpers/pydev/tests_python/_debugger_case19.py b/python/helpers/pydev/tests_python/_debugger_case19.py index aaf380c8a3f5..07ac951f05e0 100644 --- a/python/helpers/pydev/tests_python/_debugger_case19.py +++ b/python/helpers/pydev/tests_python/_debugger_case19.py @@ -5,6 +5,6 @@ class A: if __name__ == '__main__': a = A() - print a._A__var + print(a._A__var) # Evaluate 'a.__var' should give a._A__var_ print('TEST SUCEEDED') diff --git a/python/helpers/pydev/tests_python/_debugger_case7.py b/python/helpers/pydev/tests_python/_debugger_case7.py index 263110b1e990..499d8d76e650 100644 --- a/python/helpers/pydev/tests_python/_debugger_case7.py +++ b/python/helpers/pydev/tests_python/_debugger_case7.py @@ -5,4 +5,4 @@ def Call(): if __name__ == '__main__': Call() - print 'TEST SUCEEDED!' + print('TEST SUCEEDED!') diff --git a/python/helpers/pydev/tests_python/_debugger_case89.py b/python/helpers/pydev/tests_python/_debugger_case89.py index e6f32dd522bb..e22361d5a38d 100644 --- a/python/helpers/pydev/tests_python/_debugger_case89.py +++ b/python/helpers/pydev/tests_python/_debugger_case89.py @@ -1,16 +1,16 @@ def Method1(): - print 'm1' + print('m1') def Method2(): - print 'm2 before' + print('m2 before') Method1() - print 'm2 after' + print('m2 after') def Method3(): - print 'm3 before' + print('m3 before') Method2() - print 'm3 after' + print('m3 after') if __name__ == '__main__': Method3() - print 'TEST SUCEEDED!' + print('TEST SUCEEDED!') diff --git a/python/helpers/pydev/tests_python/_debugger_case_qthread1.py b/python/helpers/pydev/tests_python/_debugger_case_qthread1.py new file mode 100644 index 000000000000..eb8729f13577 --- /dev/null +++ b/python/helpers/pydev/tests_python/_debugger_case_qthread1.py @@ -0,0 +1,25 @@ +import time +import sys + +try: + from PySide import QtCore +except: + from PyQt4 import QtCore + +# Subclassing QThread +# http://doc.qt.nokia.com/latest/qthread.html +class AThread(QtCore.QThread): + + def run(self): + count = 0 + while count < 5: + time.sleep(.5) + print("Increasing", count);sys.stdout.flush() + count += 1 + +app = QtCore.QCoreApplication([]) +thread = AThread() +thread.finished.connect(app.exit) +thread.start() +app.exec_() +print('TEST SUCEEDED!') \ No newline at end of file diff --git a/python/helpers/pydev/tests_python/_debugger_case_qthread2.py b/python/helpers/pydev/tests_python/_debugger_case_qthread2.py new file mode 100644 index 000000000000..f9dca5ffa34f --- /dev/null +++ b/python/helpers/pydev/tests_python/_debugger_case_qthread2.py @@ -0,0 +1,31 @@ +import time + +try: + from PySide import QtCore +except: + from PyQt4 import QtCore + +# Subclassing QObject and using moveToThread +# http://labs.qt.nokia.com/2007/07/05/qthreads-no-longer-abstract/ +class SomeObject(QtCore.QObject): + + finished = QtCore.Signal() + + def longRunning(self): + count = 0 + while count < 5: + time.sleep(.5) + print "Increasing" + count += 1 + self.finished.emit() + +app = QtCore.QCoreApplication([]) +objThread = QtCore.QThread() +obj = SomeObject() +obj.moveToThread(objThread) +obj.finished.connect(objThread.quit) +objThread.started.connect(obj.longRunning) +objThread.finished.connect(app.exit) +objThread.start() +app.exec_() +print('TEST SUCEEDED!') \ No newline at end of file diff --git a/python/helpers/pydev/tests_python/_debugger_case_qthread3.py b/python/helpers/pydev/tests_python/_debugger_case_qthread3.py new file mode 100644 index 000000000000..d7a724cc0a1a --- /dev/null +++ b/python/helpers/pydev/tests_python/_debugger_case_qthread3.py @@ -0,0 +1,28 @@ +import time + +try: + from PySide import QtCore +except: + from PyQt4 import QtCore + +# Using a QRunnable +# http://doc.qt.nokia.com/latest/qthreadpool.html +# Note that a QRunnable isn't a subclass of QObject and therefore does +# not provide signals and slots. +class Runnable(QtCore.QRunnable): + + def run(self): + count = 0 + app = QtCore.QCoreApplication.instance() + while count < 5: + print "Increasing" + time.sleep(.5) + count += 1 + app.quit() + + +app = QtCore.QCoreApplication([]) +runnable = Runnable() +QtCore.QThreadPool.globalInstance().start(runnable) +app.exec_() +print('TEST SUCEEDED!') \ No newline at end of file diff --git a/python/helpers/pydev/tests_python/test_additional_thread_info.py b/python/helpers/pydev/tests_python/test_additional_thread_info.py index 6ae260d6a658..71dc35243257 100644 --- a/python/helpers/pydev/tests_python/test_additional_thread_info.py +++ b/python/helpers/pydev/tests_python/test_additional_thread_info.py @@ -1,10 +1,21 @@ import sys import os +import pydev_monkey sys.path.insert(0, os.path.split(os.path.split(__file__)[0])[0]) from pydevd_constants import Null import unittest +try: + import thread +except: + import _thread as thread + +try: + xrange +except: + xrange = range + #======================================================================================================================= # TestCase #======================================================================================================================= @@ -40,10 +51,7 @@ class TestCase(unittest.TestCase): def testStartNewThread(self): - import pydevd - import thread - original = thread.start_new_thread - thread.start_new_thread = pydevd.pydev_start_new_thread + pydev_monkey.patch_thread_modules() try: found = {} def function(a, b, *args, **kwargs): @@ -62,15 +70,11 @@ class TestCase(unittest.TestCase): self.assertEqual({'a': 1, 'b': 2, 'args': (3, 4), 'kwargs': {'e': 2, 'd': 1}}, found) finally: - thread.start_new_thread = original + pydev_monkey.undo_patch_thread_modules() def testStartNewThread2(self): - import pydevd - import thread - - original = thread.start_new_thread - thread.start_new_thread = pydevd.pydev_start_new_thread + pydev_monkey.patch_thread_modules() try: found = {} @@ -101,7 +105,7 @@ class TestCase(unittest.TestCase): self.assertEqual({'a': 1, 'b': 2, 'args': (3, 4), 'kwargs': {'e': 2, 'd': 1}}, found) finally: - thread.start_new_thread = original + pydev_monkey.undo_patch_thread_modules() #======================================================================================================================= diff --git a/python/helpers/pydev/tests_python/test_debugger.py b/python/helpers/pydev/tests_python/test_debugger.py index 3a216cb64079..ea569ddce556 100644 --- a/python/helpers/pydev/tests_python/test_debugger.py +++ b/python/helpers/pydev/tests_python/test_debugger.py @@ -5,6 +5,17 @@ Note that it's a python script but it'll spawn a process to run as jython, ironpython and as python. ''' +SHOW_WRITES_AND_READS = False +SHOW_OTHER_DEBUG_INFO = False +SHOW_STDOUT = False + + + +from pydevd_constants import IS_PY3K +try: + from thread import start_new_thread +except: + from _thread import start_new_thread CMD_SET_PROPERTY_TRACE, CMD_EVALUATE_CONSOLE_EXPRESSION, CMD_RUN_CUSTOM_OPERATION, CMD_ENABLE_DONT_TRACE = 133, 134, 135, 141 PYTHON_EXE = None IRONPYTHON_EXE = None @@ -14,9 +25,13 @@ JAVA_LOCATION = None import unittest import pydev_localhost - port = None +try: + xrange +except: + xrange = range + def UpdatePort(): global port s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -25,29 +40,26 @@ def UpdatePort(): s.close() import os -def NormFile(filename): +def _get_debugger_test_file(filename): try: rPath = os.path.realpath # @UndefinedVariable except: # jython does not support os.path.realpath # realpath is a no-op on systems without islink support rPath = os.path.abspath - return os.path.normcase(rPath(filename)) + + return os.path.normcase(rPath(os.path.join(os.path.dirname(__file__), filename))) + +import pydevd +PYDEVD_FILE = pydevd.__file__ -PYDEVD_FILE = NormFile('../pydevd.py') import sys -sys.path.append(os.path.dirname(PYDEVD_FILE)) - -SHOW_WRITES_AND_READS = False -SHOW_RESULT_STR = False -SHOW_OTHER_DEBUG_INFO = False - import subprocess import socket import threading import time -from urllib import quote_plus, quote, unquote_plus +from pydev_imports import quote_plus, quote, unquote_plus #======================================================================================================================= @@ -59,13 +71,16 @@ class ReaderThread(threading.Thread): threading.Thread.__init__(self) self.setDaemon(True) self.sock = sock - self.lastReceived = None + self.lastReceived = '' def run(self): + last_printed = None try: buf = '' while True: l = self.sock.recv(1024) + if IS_PY3K: + l = l.decode('utf-8') buf += l if '\n' in buf: @@ -73,7 +88,9 @@ class ReaderThread(threading.Thread): buf = '' if SHOW_WRITES_AND_READS: - print 'Test Reader Thread Received %s' % self.lastReceived.strip() + if last_printed != self.lastReceived.strip(): + last_printed = self.lastReceived.strip() + print('Test Reader Thread Received %s' % last_printed) except: pass # ok, finished it @@ -90,6 +107,8 @@ class AbstractWriterThread(threading.Thread): self.setDaemon(True) self.finishedOk = False self._next_breakpoint_id = 0 + self.log = [] + def DoKill(self): if hasattr(self, 'readerThread'): @@ -98,10 +117,14 @@ class AbstractWriterThread(threading.Thread): self.sock.close() def Write(self, s): + last = self.readerThread.lastReceived if SHOW_WRITES_AND_READS: - print 'Test Writer Thread Written %s' % (s,) - self.sock.send(s + '\n') + print('Test Writer Thread Written %s' % (s,)) + msg = s + '\n' + if IS_PY3K: + msg = msg.encode('utf-8') + self.sock.send(msg) time.sleep(0.2) i = 0 @@ -112,16 +135,16 @@ class AbstractWriterThread(threading.Thread): def StartSocket(self): if SHOW_WRITES_AND_READS: - print 'StartSocket' + print('StartSocket') s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('', port)) s.listen(1) if SHOW_WRITES_AND_READS: - print 'Waiting in socket.accept()' + print('Waiting in socket.accept()') newSock, addr = s.accept() if SHOW_WRITES_AND_READS: - print 'Test Writer Thread Socket:', newSock, addr + print('Test Writer Thread Socket:', newSock, addr) readerThread = self.readerThread = ReaderThread(newSock) readerThread.start() @@ -130,6 +153,7 @@ class AbstractWriterThread(threading.Thread): self._sequence = -1 # initial command is always the version self.WriteVersion() + self.log.append('StartSocket') def NextBreakpointId(self): self._next_breakpoint_id += 1 @@ -160,22 +184,27 @@ class AbstractWriterThread(threading.Thread): 109 is return 111 is breakpoint ''' + self.log.append('Start: WaitForBreakpointHit') i = 0 # wait for hit breakpoint - while not ('stop_reason="%s"' % reason) in self.readerThread.lastReceived: + last = self.readerThread.lastReceived + while not ('stop_reason="%s"' % reason) in last: i += 1 time.sleep(1) + last = self.readerThread.lastReceived if i >= 10: raise AssertionError('After %s seconds, a break with reason: %s was not hit. Found: %s' % \ - (i, reason, self.readerThread.lastReceived)) + (i, reason, last)) # we have something like ', '']) # TODO: When on a 32 bit python we get an int32 (which makes this test fail). - self.WaitForVar(['', '']) + self.WaitForVar([ + '', + '', + '', + ]) + self.WaitForVar([ + '', + '', + '') - self.WaitForVar('') + self.WaitForVar([ + '', + '', + ]) + self.WaitForVar([ + '', + '', + ]) self.WaitForVar('False', '%27Black%27']) + self.WaitForVar(['False', '%27Black%27']) assert 7 == self._sequence, 'Expected 9. Had: %s' % self._sequence # Change some variable self.WriteDebugConsoleExpression("%s\t%s\tEVALUATE\tcarObj.color='Red'" % (threadId, frameId)) self.WriteDebugConsoleExpression("%s\t%s\tEVALUATE\tcarObj.color" % (threadId, frameId)) - self.WaitForMultipleVars(['False', '%27Red%27']) + self.WaitForVar(['False', '%27Red%27']) assert 11 == self._sequence, 'Expected 13. Had: %s' % self._sequence # Iterate some loop self.WriteDebugConsoleExpression("%s\t%s\tEVALUATE\tfor i in range(3):" % (threadId, frameId)) - self.WaitForVars('True') - self.WriteDebugConsoleExpression("%s\t%s\tEVALUATE\t print i" % (threadId, frameId)) + self.WaitForVar(['True', '1']) + self.WriteDebugConsoleExpression("%s\t%s\tEVALUATE\t print(i)" % (threadId, frameId)) self.WriteDebugConsoleExpression("%s\t%s\tEVALUATE\t" % (threadId, frameId)) - self.WaitForVars('False') + self.WaitForVar( + [ + 'False', + '0' + ] + ) assert 17 == self._sequence, 'Expected 19. Had: %s' % self._sequence self.WriteRunThread(threadId) @@ -525,7 +577,7 @@ class WriterThreadCase14(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase13(AbstractWriterThread): - TEST_FILE = NormFile('_debugger_case13.py') + TEST_FILE = _get_debugger_test_file('_debugger_case13.py') def run(self): self.StartSocket() @@ -575,7 +627,7 @@ class WriterThreadCase13(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase12(AbstractWriterThread): - TEST_FILE = NormFile('_debugger_case10.py') + TEST_FILE = _get_debugger_test_file('_debugger_case10.py') def run(self): self.StartSocket() @@ -607,7 +659,7 @@ class WriterThreadCase12(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase11(AbstractWriterThread): - TEST_FILE = NormFile('_debugger_case10.py') + TEST_FILE = _get_debugger_test_file('_debugger_case10.py') def run(self): self.StartSocket() @@ -648,7 +700,7 @@ class WriterThreadCase11(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase10(AbstractWriterThread): - TEST_FILE = NormFile('_debugger_case10.py') + TEST_FILE = _get_debugger_test_file('_debugger_case10.py') def run(self): self.StartSocket() @@ -682,7 +734,7 @@ class WriterThreadCase10(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase9(AbstractWriterThread): - TEST_FILE = NormFile('_debugger_case89.py') + TEST_FILE = _get_debugger_test_file('_debugger_case89.py') def run(self): self.StartSocket() @@ -715,7 +767,7 @@ class WriterThreadCase9(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase8(AbstractWriterThread): - TEST_FILE = NormFile('_debugger_case89.py') + TEST_FILE = _get_debugger_test_file('_debugger_case89.py') def run(self): self.StartSocket() @@ -744,7 +796,7 @@ class WriterThreadCase8(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase7(AbstractWriterThread): - TEST_FILE = NormFile('_debugger_case7.py') + TEST_FILE = _get_debugger_test_file('_debugger_case7.py') def run(self): self.StartSocket() @@ -782,7 +834,7 @@ class WriterThreadCase7(AbstractWriterThread): #======================================================================================================================= class WriterThreadCase6(AbstractWriterThread): - TEST_FILE = NormFile('_debugger_case56.py') + TEST_FILE = _get_debugger_test_file('_debugger_case56.py') def run(self): self.StartSocket() @@ -817,7 +869,7 @@ class WriterThreadCase6(AbstractWriterThread): #======================================================================================================================= class WriterThreadCase5(AbstractWriterThread): - TEST_FILE = NormFile('_debugger_case56.py') + TEST_FILE = _get_debugger_test_file('_debugger_case56.py') def run(self): self.StartSocket() @@ -855,7 +907,7 @@ class WriterThreadCase5(AbstractWriterThread): #======================================================================================================================= class WriterThreadCase4(AbstractWriterThread): - TEST_FILE = NormFile('_debugger_case4.py') + TEST_FILE = _get_debugger_test_file('_debugger_case4.py') def run(self): self.StartSocket() @@ -877,12 +929,12 @@ class WriterThreadCase4(AbstractWriterThread): #======================================================================================================================= class WriterThreadCase3(AbstractWriterThread): - TEST_FILE = NormFile('_debugger_case3.py') + TEST_FILE = _get_debugger_test_file('_debugger_case3.py') def run(self): self.StartSocket() self.WriteMakeInitialRun() - time.sleep(1) + time.sleep(.5) breakpoint_id = self.WriteAddBreakpoint(4, '') self.WriteAddBreakpoint(5, 'FuncNotAvailable') # Check that it doesn't get hit in the global when a function is available @@ -909,7 +961,7 @@ class WriterThreadCase3(AbstractWriterThread): #======================================================================================================================= class WriterThreadCase2(AbstractWriterThread): - TEST_FILE = NormFile('_debugger_case2.py') + TEST_FILE = _get_debugger_test_file('_debugger_case2.py') def run(self): self.StartSocket() @@ -930,8 +982,79 @@ class WriterThreadCase2(AbstractWriterThread): self.WriteRunThread(threadId) + self.log.append('Checking sequence. Found: %s' % (self._sequence)) assert 15 == self._sequence, 'Expected 15. Had: %s' % self._sequence + self.log.append('Marking finished ok.') + self.finishedOk = True + +#======================================================================================================================= +# WriterThreadCaseQThread1 +#======================================================================================================================= +class WriterThreadCaseQThread1(AbstractWriterThread): + + TEST_FILE = _get_debugger_test_file('_debugger_case_qthread1.py') + + def run(self): + self.StartSocket() + breakpoint_id = self.WriteAddBreakpoint(16, 'run') + self.WriteMakeInitialRun() + + threadId, frameId = self.WaitForBreakpointHit() + + self.WriteRemoveBreakpoint(breakpoint_id) + self.WriteRunThread(threadId) + + self.log.append('Checking sequence. Found: %s' % (self._sequence)) + assert 9 == self._sequence, 'Expected 9. Had: %s' % self._sequence + + self.log.append('Marking finished ok.') + self.finishedOk = True + +#======================================================================================================================= +# WriterThreadCaseQThread2 +#======================================================================================================================= +class WriterThreadCaseQThread2(AbstractWriterThread): + + TEST_FILE = _get_debugger_test_file('_debugger_case_qthread2.py') + + def run(self): + self.StartSocket() + breakpoint_id = self.WriteAddBreakpoint(18, 'longRunning') + self.WriteMakeInitialRun() + + threadId, frameId = self.WaitForBreakpointHit() + + self.WriteRemoveBreakpoint(breakpoint_id) + self.WriteRunThread(threadId) + + self.log.append('Checking sequence. Found: %s' % (self._sequence)) + assert 9 == self._sequence, 'Expected 9. Had: %s' % self._sequence + + self.log.append('Marking finished ok.') + self.finishedOk = True + +#======================================================================================================================= +# WriterThreadCaseQThread3 +#======================================================================================================================= +class WriterThreadCaseQThread3(AbstractWriterThread): + + TEST_FILE = _get_debugger_test_file('_debugger_case_qthread3.py') + + def run(self): + self.StartSocket() + breakpoint_id = self.WriteAddBreakpoint(19, 'run') + self.WriteMakeInitialRun() + + threadId, frameId = self.WaitForBreakpointHit() + + self.WriteRemoveBreakpoint(breakpoint_id) + self.WriteRunThread(threadId) + + self.log.append('Checking sequence. Found: %s' % (self._sequence)) + assert 9 == self._sequence, 'Expected 9. Had: %s' % self._sequence + + self.log.append('Marking finished ok.') self.finishedOk = True #======================================================================================================================= @@ -939,24 +1062,39 @@ class WriterThreadCase2(AbstractWriterThread): #======================================================================================================================= class WriterThreadCase1(AbstractWriterThread): - TEST_FILE = NormFile('_debugger_case1.py') + TEST_FILE = _get_debugger_test_file('_debugger_case1.py') def run(self): self.StartSocket() + + self.log.append('writing add breakpoint') self.WriteAddBreakpoint(6, 'SetUp') + + self.log.append('making initial run') self.WriteMakeInitialRun() + self.log.append('waiting for breakpoint hit') threadId, frameId = self.WaitForBreakpointHit() + self.log.append('get frame') self.WriteGetFrame(threadId, frameId) + self.log.append('step over') self.WriteStepOver(threadId) + self.log.append('get frame') self.WriteGetFrame(threadId, frameId) + self.log.append('run thread') self.WriteRunThread(threadId) - assert 13 == self._sequence, 'Expected 13. Had: %s' % self._sequence + self.log.append('asserting') + try: + assert 13 == self._sequence, 'Expected 13. Had: %s' % self._sequence + except: + self.log.append('assert failed!') + raise + self.log.append('asserted') self.finishedOk = True @@ -972,6 +1110,7 @@ class DebuggerBase(object): UpdatePort() writerThread = writerThreadClass() writerThread.start() + time.sleep(1) localhost = pydev_localhost.get_localhost() args = self.getCommandLine() @@ -987,60 +1126,74 @@ class DebuggerBase(object): ] if SHOW_OTHER_DEBUG_INFO: - print 'executing', ' '.join(args) + print('executing', ' '.join(args)) -# process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=os.path.dirname(PYDEVD_FILE)) - process = subprocess.Popen(args, stdout=subprocess.PIPE, cwd=os.path.dirname(PYDEVD_FILE)) - class ProcessReadThread(threading.Thread): - def run(self): - self.resultStr = None - self.resultStr = process.stdout.read() - process.stdout.close() + process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=os.path.dirname(PYDEVD_FILE)) - def DoKill(self): - process.stdout.close() + stdout = [] + stderr = [] - processReadThread = ProcessReadThread() - processReadThread.setDaemon(True) - processReadThread.start() + def read(stream, buffer): + for line in stream.readlines(): + if IS_PY3K: + line = line.decode('utf-8') + + if SHOW_STDOUT: + print(line) + buffer.append(line) + + start_new_thread(read, (process.stdout, stdout)) + + if SHOW_OTHER_DEBUG_INFO: - print 'Both processes started' + print('Both processes started') # polls can fail (because the process may finish and the thread still not -- so, we give it some more chances to # finish successfully). - pools_failed = 0 - while writerThread.isAlive(): + check = 0 + while True: if process.poll() is not None: - pools_failed += 1 - time.sleep(.2) - if pools_failed == 10: break - - if process.poll() is None: - for i in range(10): - if processReadThread.resultStr is None: - time.sleep(.5) - else: - break else: - writerThread.DoKill() - - else: - if process.poll() < 0: - self.fail("The other process exited with error code: " + str(process.poll()) + " result:" + processReadThread.resultStr) + if not writerThread.isAlive(): + check += 1 + if check == 20: + print('Warning: writer thread exited and process still did not.') + if check == 100: + self.fail_with_message( + "The other process should've exited but still didn't (timeout for process to exit).", + stdout, stderr, writerThread + ) + time.sleep(.2) + + + poll = process.poll() + if poll < 0: + self.fail_with_message( + "The other process exited with error code: " + str(poll), stdout, stderr, writerThread) - if SHOW_RESULT_STR: - print processReadThread.resultStr + if stdout is None: + self.fail_with_message( + "The other process may still be running -- and didn't give any output.", stdout, stderr, writerThread) - if processReadThread.resultStr is None: - self.fail("The other process may still be running -- and didn't give any output") - - if 'TEST SUCEEDED' not in processReadThread.resultStr: - self.fail(processReadThread.resultStr) + if 'TEST SUCEEDED' not in ''.join(stdout): + self.fail_with_message("TEST SUCEEDED not found in stdout.", stdout, stderr, writerThread) + for i in xrange(100): + if not writerThread.finishedOk: + time.sleep(.1) + if not writerThread.finishedOk: - self.fail("The thread that was doing the tests didn't finish successfully. Output: %s" % processReadThread.resultStr) + self.fail_with_message( + "The thread that was doing the tests didn't finish successfully.", stdout, stderr, writerThread) + + def fail_with_message(self, msg, stdout, stderr, writerThread): + self.fail(msg+ + "\nStdout: \n"+'\n'.join(stdout)+ + "\nStderr:"+'\n'.join(stderr)+ + "\nLog:\n"+'\n'.join(getattr(writerThread, 'log', []))) + def testCase1(self): self.CheckCase(WriterThreadCase1) @@ -1098,6 +1251,30 @@ class DebuggerBase(object): def testCase19(self): self.CheckCase(WriterThreadCase19) + + def _has_qt(self): + try: + from PySide import QtCore + return True + except: + try: + from PyQt4 import QtCore + return True + except: + pass + return False + + def testCaseQthread1(self): + if self._has_qt(): + self.CheckCase(WriterThreadCaseQThread1) + + def testCaseQthread2(self): + if self._has_qt(): + self.CheckCase(WriterThreadCaseQThread2) + + def testCaseQthread3(self): + if self._has_qt(): + self.CheckCase(WriterThreadCaseQThread3) class TestPython(unittest.TestCase, DebuggerBase): @@ -1117,9 +1294,6 @@ class TestJython(unittest.TestCase, DebuggerBase): def testCase13(self): self.skipTest("Unsupported Decorators") - def testCase16(self): - self.skipTest("Unsupported numpy") - # This case requires decorators to work (which are not present on Jython 2.1), so, this test is just removed from the jython run. def testCase17(self): self.skipTest("Unsupported Decorators") @@ -1127,6 +1301,9 @@ class TestJython(unittest.TestCase, DebuggerBase): def testCase18(self): self.skipTest("Unsupported assign to local") + def testCase16(self): + self.skipTest("Unsupported numpy") + class TestIronPython(unittest.TestCase, DebuggerBase): def getCommandLine(self): return [ @@ -1134,8 +1311,22 @@ class TestIronPython(unittest.TestCase, DebuggerBase): '-X:Frames' ] + def testCase3(self): + self.skipTest("Timing issues") # This test fails once in a while due to timing issues on IronPython, so, skipping it. + + def testCase7(self): + # This test checks that we start without variables and at each step a new var is created, but on ironpython, + # the variables exist all at once (with None values), so, we can't test it properly. + self.skipTest("Different behavior on IronPython") + + def testCase13(self): + self.skipTest("Unsupported Decorators") # Not sure why it doesn't work on IronPython, but it's not so common, so, leave it be. + def testCase16(self): self.skipTest("Unsupported numpy") + + def testCase18(self): + self.skipTest("Unsupported assign to local") def GetLocationFromLine(line): @@ -1157,49 +1348,90 @@ def SplitLine(line): + import platform sysname = platform.system().lower() test_dependent = os.path.join('../../../', 'org.python.pydev.core', 'tests', 'org', 'python', 'pydev', 'core', 'TestDependent.' + sysname + '.properties') -f = open(test_dependent) -try: - for line in f.readlines(): - var, loc = SplitLine(line) - if 'PYTHON_EXE' == var: - PYTHON_EXE = loc - if 'IRONPYTHON_EXE' == var: - IRONPYTHON_EXE = loc - - if 'JYTHON_JAR_LOCATION' == var: - JYTHON_JAR_LOCATION = loc - - if 'JAVA_LOCATION' == var: - JAVA_LOCATION = loc -finally: - f.close() - -assert PYTHON_EXE, 'PYTHON_EXE not found in %s' % (test_dependent,) -assert IRONPYTHON_EXE, 'IRONPYTHON_EXE not found in %s' % (test_dependent,) -assert JYTHON_JAR_LOCATION, 'JYTHON_JAR_LOCATION not found in %s' % (test_dependent,) -assert JAVA_LOCATION, 'JAVA_LOCATION not found in %s' % (test_dependent,) -assert os.path.exists(PYTHON_EXE), 'The location: %s is not valid' % (PYTHON_EXE,) -assert os.path.exists(IRONPYTHON_EXE), 'The location: %s is not valid' % (IRONPYTHON_EXE,) -assert os.path.exists(JYTHON_JAR_LOCATION), 'The location: %s is not valid' % (JYTHON_JAR_LOCATION,) -assert os.path.exists(JAVA_LOCATION), 'The location: %s is not valid' % (JAVA_LOCATION,) - -if False: - suite = unittest.TestSuite() - #PYTHON_EXE = r'C:\bin\Anaconda\python.exe' -# suite.addTest(TestPython('testCase10')) -# suite.addTest(TestPython('testCase3')) -# suite.addTest(TestPython('testCase16')) -# suite.addTest(TestPython('testCase17')) -# suite.addTest(TestPython('testCase18')) -# suite.addTest(TestPython('testCase19')) - suite = unittest.makeSuite(TestPython) - unittest.TextTestRunner(verbosity=3).run(suite) +if os.path.exists(test_dependent): + f = open(test_dependent) + try: + for line in f.readlines(): + var, loc = SplitLine(line) + if 'PYTHON_EXE' == var: + PYTHON_EXE = loc -# unittest.TextTestRunner(verbosity=3).run(suite) -# -# suite = unittest.makeSuite(TestJython) -# unittest.TextTestRunner(verbosity=3).run(suite) + if 'IRONPYTHON_EXE' == var: + IRONPYTHON_EXE = loc + + if 'JYTHON_JAR_LOCATION' == var: + JYTHON_JAR_LOCATION = loc + + if 'JAVA_LOCATION' == var: + JAVA_LOCATION = loc + finally: + f.close() +else: + pass + +if IRONPYTHON_EXE is None: + sys.stderr.write('Warning: not running IronPython tests.\n') + class TestIronPython(unittest.TestCase): + pass + +if JAVA_LOCATION is None: + sys.stderr.write('Warning: not running Jython tests.\n') + class TestJython(unittest.TestCase): + pass + +# if PYTHON_EXE is None: +PYTHON_EXE = sys.executable + + +if __name__ == '__main__': + if False: + assert PYTHON_EXE, 'PYTHON_EXE not found in %s' % (test_dependent,) + assert IRONPYTHON_EXE, 'IRONPYTHON_EXE not found in %s' % (test_dependent,) + assert JYTHON_JAR_LOCATION, 'JYTHON_JAR_LOCATION not found in %s' % (test_dependent,) + assert JAVA_LOCATION, 'JAVA_LOCATION not found in %s' % (test_dependent,) + assert os.path.exists(PYTHON_EXE), 'The location: %s is not valid' % (PYTHON_EXE,) + assert os.path.exists(IRONPYTHON_EXE), 'The location: %s is not valid' % (IRONPYTHON_EXE,) + assert os.path.exists(JYTHON_JAR_LOCATION), 'The location: %s is not valid' % (JYTHON_JAR_LOCATION,) + assert os.path.exists(JAVA_LOCATION), 'The location: %s is not valid' % (JAVA_LOCATION,) + + if True: + #try: + # os.remove(r'X:\pydev\plugins\org.python.pydev\pysrc\pydevd.pyc') + #except: + # pass + suite = unittest.TestSuite() + +# suite.addTests(unittest.makeSuite(TestJython)) # Note: Jython should be 2.2.1 +# +# suite.addTests(unittest.makeSuite(TestIronPython)) +# +# suite.addTests(unittest.makeSuite(TestPython)) + + + + +# suite.addTest(TestIronPython('testCase18')) +# suite.addTest(TestIronPython('testCase17')) +# suite.addTest(TestIronPython('testCase3')) +# suite.addTest(TestIronPython('testCase7')) +# + suite.addTest(TestPython('testCaseQthread1')) + suite.addTest(TestPython('testCaseQthread2')) + suite.addTest(TestPython('testCaseQthread3')) + +# suite.addTest(TestPython('testCase4')) + + +# suite.addTest(TestJython('testCase1')) +# suite.addTest(TestPython('testCase2')) +# unittest.TextTestRunner(verbosity=3).run(suite) + # suite.addTest(TestPython('testCase17')) + # suite.addTest(TestPython('testCase18')) + # suite.addTest(TestPython('testCase19')) + + unittest.TextTestRunner(verbosity=3).run(suite) diff --git a/python/helpers/pydev/tests_python/test_pydev_monkey.py b/python/helpers/pydev/tests_python/test_pydev_monkey.py index 3eb7930b73ae..be1312a066d3 100644 --- a/python/helpers/pydev/tests_python/test_pydev_monkey.py +++ b/python/helpers/pydev/tests_python/test_pydev_monkey.py @@ -1,17 +1,32 @@ import unittest import pydev_monkey import sys +from pydevd import SetupHolder +from pydev_monkey import pydev_src_dir class TestCase(unittest.TestCase): def test_monkey(self): - check='''C:\\bin\\python.exe -u -c " + original = SetupHolder.setup + + try: + SetupHolder.setup = {'client':'127.0.0.1', 'port': '0'} + check='''C:\\bin\\python.exe -u -c " connect(\\"127.0.0.1\\") "''' - sys.original_argv = [] - self.assertEqual('"-u" "-c" "\nconnect(\\"127.0.0.1\\")\n"', pydev_monkey.patch_arg_str_win(check)) + sys.original_argv = [] + self.assertEqual( + '"C:\\bin\\python.exe" "-u" "-c" "import sys; ' + 'sys.path.append(r\'%s\'); ' + 'import pydevd; pydevd.settrace(host=\'127.0.0.1\', port=0, suspend=False, ' + 'trace_only_current_thread=False, patch_multiprocessing=True); ' + '\nconnect(\\"127.0.0.1\\")\n"' % pydev_src_dir, + pydev_monkey.patch_arg_str_win(check) + ) + finally: + SetupHolder.setup = original def test_str_to_args_windows(self): diff --git a/python/helpers/pydev/tests_python/test_save_locals.py b/python/helpers/pydev/tests_python/test_save_locals.py index fe65d4d438d1..a3beb567d305 100644 --- a/python/helpers/pydev/tests_python/test_save_locals.py +++ b/python/helpers/pydev/tests_python/test_save_locals.py @@ -16,7 +16,7 @@ def use_save_locals(name, value): save_locals(frame) -def test_method(fn): +def check_method(fn): """ A harness for testing methods that attempt to modify the values of locals on the stack. """ @@ -36,7 +36,7 @@ class TestSetLocals(unittest.TestCase): def test_set_locals_using_save_locals(self): - x = test_method(use_save_locals) + x = check_method(use_save_locals) self.assertEqual(x, 2) # Expected to succeed @@ -65,7 +65,7 @@ class TestSetLocals(unittest.TestCase): def check_co_vars(a): frame = sys._getframe() def function2(): - print a + print(a) assert 'a' in frame.f_code.co_cellvars frame = sys._getframe() diff --git a/python/helpers/pydev/tests_runfiles/samples/__init__.py b/python/helpers/pydev/tests_runfiles/samples/__init__.py deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/python/helpers/pydev/tests_runfiles/samples/nested_dir/.cvsignore b/python/helpers/pydev/tests_runfiles/samples/nested_dir/.cvsignore new file mode 100644 index 000000000000..d1c899510a28 --- /dev/null +++ b/python/helpers/pydev/tests_runfiles/samples/nested_dir/.cvsignore @@ -0,0 +1,2 @@ +*.class +*.pyc diff --git a/python/helpers/pydev/tests_runfiles/samples/nested_dir/nested2/.cvsignore b/python/helpers/pydev/tests_runfiles/samples/nested_dir/nested2/.cvsignore new file mode 100644 index 000000000000..d1c899510a28 --- /dev/null +++ b/python/helpers/pydev/tests_runfiles/samples/nested_dir/nested2/.cvsignore @@ -0,0 +1,2 @@ +*.class +*.pyc diff --git a/python/helpers/pydev/tests_runfiles/samples/nested_dir/nested3/.cvsignore b/python/helpers/pydev/tests_runfiles/samples/nested_dir/nested3/.cvsignore new file mode 100644 index 000000000000..d1c899510a28 --- /dev/null +++ b/python/helpers/pydev/tests_runfiles/samples/nested_dir/nested3/.cvsignore @@ -0,0 +1,2 @@ +*.class +*.pyc diff --git a/python/helpers/pydev/tests_runfiles/samples/not_in_default_pythonpath.txt b/python/helpers/pydev/tests_runfiles/samples/not_in_default_pythonpath.txt new file mode 100644 index 000000000000..29cdc5bc1078 --- /dev/null +++ b/python/helpers/pydev/tests_runfiles/samples/not_in_default_pythonpath.txt @@ -0,0 +1 @@ +(no __init__.py file) \ No newline at end of file diff --git a/python/helpers/pydev/tests_runfiles/test_runfiles.py b/python/helpers/pydev/tests_runfiles/test_runfiles.py index 0c04764e99fc..2d381a39be5e 100644 --- a/python/helpers/pydev/tests_runfiles/test_runfiles.py +++ b/python/helpers/pydev/tests_runfiles/test_runfiles.py @@ -191,7 +191,7 @@ class RunfilesTest(unittest.TestCase): files_with_tests = [1 for t in self.all_tests if len(t._tests) > 0] self.assertNotEquals(len(self.files), len(files_with_tests)) - def count_tests(self, tests): + def count_suite(self, tests=None): total = 0 for t in tests: total += t.countTestCases() @@ -207,60 +207,60 @@ class RunfilesTest(unittest.TestCase): def test_finding_tests_from_modules_with_bad_filter_returns_0_tests(self): self._setup_scenario(self.file_dir, ["NO_TESTS_ARE_SURE_TO_HAVE_THIS_NAME"]) - self.assertEquals(0, self.count_tests(self.all_tests)) + self.assertEquals(0, self.count_suite(self.all_tests)) def test_finding_test_with_unique_name_returns_1_test(self): self._setup_scenario(self.file_dir, include_tests=["test_i_am_a_unique_test_name"]) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEquals(1, self.count_tests(filtered_tests)) + self.assertEquals(1, self.count_suite(filtered_tests)) def test_finding_test_with_non_unique_name(self): self._setup_scenario(self.file_dir, include_tests=["test_non_unique_name"]) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEquals(1, self.count_tests(filtered_tests) > 2) + self.assertEquals(1, self.count_suite(filtered_tests) > 2) def test_finding_tests_with_regex_filters(self): self._setup_scenario(self.file_dir, include_tests=["test_non*"]) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEquals(1, self.count_tests(filtered_tests) > 2) + self.assertEquals(1, self.count_suite(filtered_tests) > 2) self._setup_scenario(self.file_dir, ["^$"]) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEquals(0, self.count_tests(filtered_tests)) + self.assertEquals(0, self.count_suite(filtered_tests)) self._setup_scenario(self.file_dir, None, exclude_tests=["*"]) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEquals(0, self.count_tests(filtered_tests)) + self.assertEquals(0, self.count_suite(filtered_tests)) def test_matching_tests(self): self._setup_scenario(self.file_dir, None, ['StillYetAnotherSampleTest']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(1, self.count_tests(filtered_tests)) + self.assertEqual(1, self.count_suite(filtered_tests)) self._setup_scenario(self.file_dir, None, ['SampleTest.test_xxxxxx1']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(1, self.count_tests(filtered_tests)) + self.assertEqual(1, self.count_suite(filtered_tests)) self._setup_scenario(self.file_dir, None, ['SampleTest']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(8, self.count_tests(filtered_tests)) + self.assertEqual(8, self.count_suite(filtered_tests)) self._setup_scenario(self.file_dir, None, ['AnotherSampleTest.todo_not_tested']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(1, self.count_tests(filtered_tests)) + self.assertEqual(1, self.count_suite(filtered_tests)) self._setup_scenario(self.file_dir, None, ['StillYetAnotherSampleTest', 'SampleTest.test_xxxxxx1']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(2, self.count_tests(filtered_tests)) + self.assertEqual(2, self.count_suite(filtered_tests)) self._setup_scenario(self.file_dir, None, exclude_tests=['*']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(self.count_tests(filtered_tests), 0) + self.assertEqual(self.count_suite(filtered_tests), 0) self._setup_scenario(self.file_dir, None, exclude_tests=['*a*']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(self.count_tests(filtered_tests), 6) + self.assertEqual(self.count_suite(filtered_tests), 6) self.assertEqual( set(self.MyTestRunner.list_test_names(filtered_tests)), @@ -269,7 +269,7 @@ class RunfilesTest(unittest.TestCase): self._setup_scenario(self.file_dir, None, exclude_tests=['*a*', '*x*']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(self.count_tests(filtered_tests), 2) + self.assertEqual(self.count_suite(filtered_tests), 2) self.assertEqual( set(self.MyTestRunner.list_test_names(filtered_tests)), @@ -362,17 +362,43 @@ class RunfilesTest(unittest.TestCase): ('notifyTest', 'ok', '', '', simple_test, 'SampleTest.test_xxxxxx2'), ('notifyTest', 'ok', '', '', simple_test2, 'YetAnotherSampleTest.test_abc'), ] + if not IS_JYTHON: - expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpClass.', - simpleClass_test.replace('/', os.path.sep), 'samples.simpleClass_test.SetUpClassTest ')) - expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpModule.', - simpleModule_test.replace('/', os.path.sep), 'samples.simpleModule_test ')) + if 'samples.simpleClass_test' in str(notifications): + expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpClass.', + simpleClass_test.replace('/', os.path.sep), 'samples.simpleClass_test.SetUpClassTest ')) + expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpModule.', + simpleModule_test.replace('/', os.path.sep), 'samples.simpleModule_test ')) + else: + expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpClass.', + simpleClass_test.replace('/', os.path.sep), 'simpleClass_test.SetUpClassTest ')) + expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpModule.', + simpleModule_test.replace('/', os.path.sep), 'simpleModule_test ')) else: expected.append(('notifyTest', 'ok', '', '', simpleClass_test, 'SetUpClassTest.test_blank')) expected.append(('notifyTest', 'ok', '', '', simpleModule_test, 'SetUpModuleTest.test_blank')) expected.append(('notifyTestRunFinished',)) expected.sort() + new_notifications = [] + for notification in expected: + try: + if len(notification) == 6: + # Some are binary on Py3. + new_notifications.append(( + notification[0], + notification[1], + notification[2].encode('latin1'), + notification[3].encode('latin1'), + notification[4], + notification[5], + )) + else: + new_notifications.append(notification) + except: + raise + expected = new_notifications + notifications.sort() self.assertEqual( expected, diff --git a/python/helpers/pydev/third_party/__init__.py b/python/helpers/pydev/third_party/__init__.py new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/python/helpers/pydev/third_party/__init__.py @@ -0,0 +1 @@ + diff --git a/python/helpers/pydev/third_party/pep8/autopep8.py b/python/helpers/pydev/third_party/pep8/autopep8.py new file mode 100644 index 000000000000..224b5c645949 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/autopep8.py @@ -0,0 +1,3687 @@ +#!/usr/bin/env python +# +# Copyright (C) 2010-2011 Hideo Hattori +# Copyright (C) 2011-2013 Hideo Hattori, Steven Myint +# Copyright (C) 2013-2014 Hideo Hattori, Steven Myint, Bill Wendling +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""Automatically formats Python code to conform to the PEP 8 style guide. + +Fixes that only need be done once can be added by adding a function of the form +"fix_(source)" to this module. They should return the fixed source code. +These fixes are picked up by apply_global_fixes(). + +Fixes that depend on pep8 should be added as methods to FixPEP8. See the class +documentation for more information. + +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +import bisect +import codecs +import collections +import copy +import difflib +import fnmatch +import inspect +import io +import itertools +import keyword +import locale +import os +import re +import signal +import sys +import token +import tokenize + +import pep8 + + +try: + unicode +except NameError: + unicode = str + + +__version__ = '1.0.3' + + +CR = '\r' +LF = '\n' +CRLF = '\r\n' + + +PYTHON_SHEBANG_REGEX = re.compile(r'^#!.*\bpython[23]?\b\s*$') + + +# For generating line shortening candidates. +SHORTEN_OPERATOR_GROUPS = frozenset([ + frozenset([',']), + frozenset(['%']), + frozenset([',', '(', '[', '{']), + frozenset(['%', '(', '[', '{']), + frozenset([',', '(', '[', '{', '%', '+', '-', '*', '/', '//']), + frozenset(['%', '+', '-', '*', '/', '//']), +]) + + +DEFAULT_IGNORE = 'E24' +DEFAULT_INDENT_SIZE = 4 + + +# W602 is handled separately due to the need to avoid "with_traceback". +CODE_TO_2TO3 = { + 'E721': ['idioms'], + 'W601': ['has_key'], + 'W603': ['ne'], + 'W604': ['repr'], + 'W690': ['apply', + 'except', + 'exitfunc', + 'import', + 'numliterals', + 'operator', + 'paren', + 'reduce', + 'renames', + 'standarderror', + 'sys_exc', + 'throw', + 'tuple_params', + 'xreadlines']} + + +def check_lib2to3(): + try: + import lib2to3 + except ImportError: + sys.path.append(os.path.join(os.path.dirname(__file__), 'lib2to3')) + import lib2to3 + + +def open_with_encoding(filename, encoding=None, mode='r'): + """Return opened file with a specific encoding.""" + if not encoding: + encoding = detect_encoding(filename) + + return io.open(filename, mode=mode, encoding=encoding, + newline='') # Preserve line endings + + +def detect_encoding(filename): + """Return file encoding.""" + try: + with open(filename, 'rb') as input_file: + check_lib2to3() + from lib2to3.pgen2 import tokenize as lib2to3_tokenize + encoding = lib2to3_tokenize.detect_encoding(input_file.readline)[0] + + # Check for correctness of encoding + with open_with_encoding(filename, encoding) as test_file: + test_file.read() + + return encoding + except (LookupError, SyntaxError, UnicodeDecodeError): + return 'latin-1' + + +def readlines_from_file(filename): + """Return contents of file.""" + with open_with_encoding(filename) as input_file: + return input_file.readlines() + + +def extended_blank_lines(logical_line, + blank_lines, + indent_level, + previous_logical): + """Check for missing blank lines after class declaration.""" + if previous_logical.startswith('class '): + if ( + logical_line.startswith(('def ', 'class ', '@')) or + pep8.DOCSTRING_REGEX.match(logical_line) + ): + if indent_level and not blank_lines: + yield (0, 'E309 expected 1 blank line after class declaration') + elif previous_logical.startswith('def '): + if blank_lines and pep8.DOCSTRING_REGEX.match(logical_line): + yield (0, 'E303 too many blank lines ({0})'.format(blank_lines)) + elif pep8.DOCSTRING_REGEX.match(previous_logical): + # Missing blank line between class docstring and method declaration. + if ( + indent_level and + not blank_lines and + logical_line.startswith(('def ')) and + '(self' in logical_line + ): + yield (0, 'E301 expected 1 blank line, found 0') +pep8.register_check(extended_blank_lines) + + +def continued_indentation(logical_line, tokens, indent_level, indent_char, + noqa): + """Override pep8's function to provide indentation information.""" + first_row = tokens[0][2][0] + nrows = 1 + tokens[-1][2][0] - first_row + if noqa or nrows == 1: + return + + # indent_next tells us whether the next block is indented. Assuming + # that it is indented by 4 spaces, then we should not allow 4-space + # indents on the final continuation line. In turn, some other + # indents are allowed to have an extra 4 spaces. + indent_next = logical_line.endswith(':') + + row = depth = 0 + valid_hangs = ( + (DEFAULT_INDENT_SIZE,) + if indent_char != '\t' else (DEFAULT_INDENT_SIZE, + 2 * DEFAULT_INDENT_SIZE) + ) + + # Remember how many brackets were opened on each line. + parens = [0] * nrows + + # Relative indents of physical lines. + rel_indent = [0] * nrows + + # For each depth, collect a list of opening rows. + open_rows = [[0]] + # For each depth, memorize the hanging indentation. + hangs = [None] + + # Visual indents. + indent_chances = {} + last_indent = tokens[0][2] + indent = [last_indent[1]] + + last_token_multiline = None + line = None + last_line = '' + last_line_begins_with_multiline = False + for token_type, text, start, end, line in tokens: + + newline = row < start[0] - first_row + if newline: + row = start[0] - first_row + newline = (not last_token_multiline and + token_type not in (tokenize.NL, tokenize.NEWLINE)) + last_line_begins_with_multiline = last_token_multiline + + if newline: + # This is the beginning of a continuation line. + last_indent = start + + # Record the initial indent. + rel_indent[row] = pep8.expand_indent(line) - indent_level + + # Identify closing bracket. + close_bracket = (token_type == tokenize.OP and text in ']})') + + # Is the indent relative to an opening bracket line? + for open_row in reversed(open_rows[depth]): + hang = rel_indent[row] - rel_indent[open_row] + hanging_indent = hang in valid_hangs + if hanging_indent: + break + if hangs[depth]: + hanging_indent = (hang == hangs[depth]) + + visual_indent = (not close_bracket and hang > 0 and + indent_chances.get(start[1])) + + if close_bracket and indent[depth]: + # Closing bracket for visual indent. + if start[1] != indent[depth]: + yield (start, 'E124 {0}'.format(indent[depth])) + elif close_bracket and not hang: + pass + elif indent[depth] and start[1] < indent[depth]: + # Visual indent is broken. + yield (start, 'E128 {0}'.format(indent[depth])) + elif (hanging_indent or + (indent_next and + rel_indent[row] == 2 * DEFAULT_INDENT_SIZE)): + # Hanging indent is verified. + if close_bracket: + yield (start, 'E123 {0}'.format(indent_level + + rel_indent[open_row])) + hangs[depth] = hang + elif visual_indent is True: + # Visual indent is verified. + indent[depth] = start[1] + elif visual_indent in (text, unicode): + # Ignore token lined up with matching one from a previous line. + pass + else: + one_indented = (indent_level + rel_indent[open_row] + + DEFAULT_INDENT_SIZE) + # Indent is broken. + if hang <= 0: + error = ('E122', one_indented) + elif indent[depth]: + error = ('E127', indent[depth]) + elif hang > DEFAULT_INDENT_SIZE: + error = ('E126', one_indented) + else: + hangs[depth] = hang + error = ('E121', one_indented) + + yield (start, '{0} {1}'.format(*error)) + + # Look for visual indenting. + if (parens[row] and token_type not in (tokenize.NL, tokenize.COMMENT) + and not indent[depth]): + indent[depth] = start[1] + indent_chances[start[1]] = True + # Deal with implicit string concatenation. + elif (token_type in (tokenize.STRING, tokenize.COMMENT) or + text in ('u', 'ur', 'b', 'br')): + indent_chances[start[1]] = unicode + # Special case for the "if" statement because len("if (") is equal to + # 4. + elif not indent_chances and not row and not depth and text == 'if': + indent_chances[end[1] + 1] = True + elif text == ':' and line[end[1]:].isspace(): + open_rows[depth].append(row) + + # Keep track of bracket depth. + if token_type == tokenize.OP: + if text in '([{': + depth += 1 + indent.append(0) + hangs.append(None) + if len(open_rows) == depth: + open_rows.append([]) + open_rows[depth].append(row) + parens[row] += 1 + elif text in ')]}' and depth > 0: + # Parent indents should not be more than this one. + prev_indent = indent.pop() or last_indent[1] + hangs.pop() + for d in range(depth): + if indent[d] > prev_indent: + indent[d] = 0 + for ind in list(indent_chances): + if ind >= prev_indent: + del indent_chances[ind] + del open_rows[depth + 1:] + depth -= 1 + if depth: + indent_chances[indent[depth]] = True + for idx in range(row, -1, -1): + if parens[idx]: + parens[idx] -= 1 + break + assert len(indent) == depth + 1 + if ( + start[1] not in indent_chances and + # This is for purposes of speeding up E121 (GitHub #90). + not last_line.rstrip().endswith(',') + ): + # Allow to line up tokens. + indent_chances[start[1]] = text + + last_token_multiline = (start[0] != end[0]) + if last_token_multiline: + rel_indent[end[0] - first_row] = rel_indent[row] + + last_line = line + + if ( + indent_next and + not last_line_begins_with_multiline and + pep8.expand_indent(line) == indent_level + DEFAULT_INDENT_SIZE + ): + pos = (start[0], indent[0] + 4) + yield (pos, 'E125 {0}'.format(indent_level + + 2 * DEFAULT_INDENT_SIZE)) +del pep8._checks['logical_line'][pep8.continued_indentation] +pep8.register_check(continued_indentation) + + +class FixPEP8(object): + + """Fix invalid code. + + Fixer methods are prefixed "fix_". The _fix_source() method looks for these + automatically. + + The fixer method can take either one or two arguments (in addition to + self). The first argument is "result", which is the error information from + pep8. The second argument, "logical", is required only for logical-line + fixes. + + The fixer method can return the list of modified lines or None. An empty + list would mean that no changes were made. None would mean that only the + line reported in the pep8 error was modified. Note that the modified line + numbers that are returned are indexed at 1. This typically would correspond + with the line number reported in the pep8 error information. + + [fixed method list] + - e121,e122,e123,e124,e125,e126,e127,e128,e129 + - e201,e202,e203 + - e211 + - e221,e222,e223,e224,e225 + - e231 + - e251 + - e261,e262 + - e271,e272,e273,e274 + - e301,e302,e303 + - e401 + - e502 + - e701,e702 + - e711 + - w291 + + """ + + def __init__(self, filename, + options, + contents=None, + long_line_ignore_cache=None): + self.filename = filename + if contents is None: + self.source = readlines_from_file(filename) + else: + sio = io.StringIO(contents) + self.source = sio.readlines() + self.options = options + self.indent_word = _get_indentword(''.join(self.source)) + + self.long_line_ignore_cache = ( + set() if long_line_ignore_cache is None + else long_line_ignore_cache) + + # Many fixers are the same even though pep8 categorizes them + # differently. + self.fix_e115 = self.fix_e112 + self.fix_e116 = self.fix_e113 + self.fix_e121 = self._fix_reindent + self.fix_e122 = self._fix_reindent + self.fix_e123 = self._fix_reindent + self.fix_e124 = self._fix_reindent + self.fix_e126 = self._fix_reindent + self.fix_e127 = self._fix_reindent + self.fix_e128 = self._fix_reindent + self.fix_e129 = self._fix_reindent + self.fix_e202 = self.fix_e201 + self.fix_e203 = self.fix_e201 + self.fix_e211 = self.fix_e201 + self.fix_e221 = self.fix_e271 + self.fix_e222 = self.fix_e271 + self.fix_e223 = self.fix_e271 + self.fix_e226 = self.fix_e225 + self.fix_e227 = self.fix_e225 + self.fix_e228 = self.fix_e225 + self.fix_e241 = self.fix_e271 + self.fix_e242 = self.fix_e224 + self.fix_e261 = self.fix_e262 + self.fix_e272 = self.fix_e271 + self.fix_e273 = self.fix_e271 + self.fix_e274 = self.fix_e271 + self.fix_e309 = self.fix_e301 + self.fix_e501 = ( + self.fix_long_line_logically if + options and (options.aggressive >= 2 or options.experimental) else + self.fix_long_line_physically) + self.fix_e703 = self.fix_e702 + + self._ws_comma_done = False + + def _fix_source(self, results): + try: + (logical_start, logical_end) = _find_logical(self.source) + logical_support = True + except (SyntaxError, tokenize.TokenError): # pragma: no cover + logical_support = False + + completed_lines = set() + for result in sorted(results, key=_priority_key): + if result['line'] in completed_lines: + continue + + fixed_methodname = 'fix_' + result['id'].lower() + if hasattr(self, fixed_methodname): + fix = getattr(self, fixed_methodname) + + line_index = result['line'] - 1 + original_line = self.source[line_index] + + is_logical_fix = len(inspect.getargspec(fix).args) > 2 + if is_logical_fix: + logical = None + if logical_support: + logical = _get_logical(self.source, + result, + logical_start, + logical_end) + if logical and set(range( + logical[0][0] + 1, + logical[1][0] + 1)).intersection( + completed_lines): + continue + + modified_lines = fix(result, logical) + else: + modified_lines = fix(result) + + if modified_lines is None: + # Force logical fixes to report what they modified. + assert not is_logical_fix + + if self.source[line_index] == original_line: + modified_lines = [] + + if modified_lines: + completed_lines.update(modified_lines) + elif modified_lines == []: # Empty list means no fix + if self.options.verbose >= 2: + print( + '---> Not fixing {f} on line {l}'.format( + f=result['id'], l=result['line']), + file=sys.stderr) + else: # We assume one-line fix when None. + completed_lines.add(result['line']) + else: + if self.options.verbose >= 3: + print( + "---> '{0}' is not defined.".format(fixed_methodname), + file=sys.stderr) + + info = result['info'].strip() + print('---> {0}:{1}:{2}:{3}'.format(self.filename, + result['line'], + result['column'], + info), + file=sys.stderr) + + def fix(self): + """Return a version of the source code with PEP 8 violations fixed.""" + pep8_options = { + 'ignore': self.options.ignore, + 'select': self.options.select, + 'max_line_length': self.options.max_line_length, + } + results = _execute_pep8(pep8_options, self.source) + + if self.options.verbose: + progress = {} + for r in results: + if r['id'] not in progress: + progress[r['id']] = set() + progress[r['id']].add(r['line']) + print('---> {n} issue(s) to fix {progress}'.format( + n=len(results), progress=progress), file=sys.stderr) + + if self.options.line_range: + start, end = self.options.line_range + results = [r for r in results + if start <= r['line'] <= end] + + self._fix_source(filter_results(source=''.join(self.source), + results=results, + aggressive=self.options.aggressive)) + + if self.options.line_range: + # If number of lines has changed then change line_range. + count = sum(sline.count('\n') + for sline in self.source[start - 1:end]) + self.options.line_range[1] = start + count - 1 + + return ''.join(self.source) + + def _fix_reindent(self, result): + """Fix a badly indented line. + + This is done by adding or removing from its initial indent only. + + """ + num_indent_spaces = int(result['info'].split()[1]) + line_index = result['line'] - 1 + target = self.source[line_index] + + self.source[line_index] = ' ' * num_indent_spaces + target.lstrip() + + def fix_e112(self, result): + """Fix under-indented comments.""" + line_index = result['line'] - 1 + target = self.source[line_index] + + if not target.lstrip().startswith('#'): + # Don't screw with invalid syntax. + return [] + + self.source[line_index] = self.indent_word + target + + def fix_e113(self, result): + """Fix over-indented comments.""" + line_index = result['line'] - 1 + target = self.source[line_index] + + indent = _get_indentation(target) + stripped = target.lstrip() + + if not stripped.startswith('#'): + # Don't screw with invalid syntax. + return [] + + self.source[line_index] = indent[1:] + stripped + + def fix_e125(self, result): + """Fix indentation undistinguish from the next logical line.""" + num_indent_spaces = int(result['info'].split()[1]) + line_index = result['line'] - 1 + target = self.source[line_index] + + spaces_to_add = num_indent_spaces - len(_get_indentation(target)) + indent = len(_get_indentation(target)) + modified_lines = [] + + while len(_get_indentation(self.source[line_index])) >= indent: + self.source[line_index] = (' ' * spaces_to_add + + self.source[line_index]) + modified_lines.append(1 + line_index) # Line indexed at 1. + line_index -= 1 + + return modified_lines + + def fix_e201(self, result): + """Remove extraneous whitespace.""" + line_index = result['line'] - 1 + target = self.source[line_index] + offset = result['column'] - 1 + + if is_probably_part_of_multiline(target): + return [] + + fixed = fix_whitespace(target, + offset=offset, + replacement='') + + self.source[line_index] = fixed + + def fix_e224(self, result): + """Remove extraneous whitespace around operator.""" + target = self.source[result['line'] - 1] + offset = result['column'] - 1 + fixed = target[:offset] + target[offset:].replace('\t', ' ') + self.source[result['line'] - 1] = fixed + + def fix_e225(self, result): + """Fix missing whitespace around operator.""" + target = self.source[result['line'] - 1] + offset = result['column'] - 1 + fixed = target[:offset] + ' ' + target[offset:] + + # Only proceed if non-whitespace characters match. + # And make sure we don't break the indentation. + if ( + fixed.replace(' ', '') == target.replace(' ', '') and + _get_indentation(fixed) == _get_indentation(target) + ): + self.source[result['line'] - 1] = fixed + else: + return [] + + def fix_e231(self, result): + """Add missing whitespace.""" + # Optimize for comma case. This will fix all commas in the full source + # code in one pass. Don't do this more than once. If it fails the first + # time, there is no point in trying again. + if ',' in result['info'] and not self._ws_comma_done: + self._ws_comma_done = True + original = ''.join(self.source) + new = refactor(original, ['ws_comma']) + if original.strip() != new.strip(): + self.source = [new] + return range(1, 1 + len(original)) + + line_index = result['line'] - 1 + target = self.source[line_index] + offset = result['column'] + fixed = target[:offset] + ' ' + target[offset:] + self.source[line_index] = fixed + + def fix_e251(self, result): + """Remove whitespace around parameter '=' sign.""" + line_index = result['line'] - 1 + target = self.source[line_index] + + # This is necessary since pep8 sometimes reports columns that goes + # past the end of the physical line. This happens in cases like, + # foo(bar\n=None) + c = min(result['column'] - 1, + len(target) - 1) + + if target[c].strip(): + fixed = target + else: + fixed = target[:c].rstrip() + target[c:].lstrip() + + # There could be an escaped newline + # + # def foo(a=\ + # 1) + if fixed.endswith(('=\\\n', '=\\\r\n', '=\\\r')): + self.source[line_index] = fixed.rstrip('\n\r \t\\') + self.source[line_index + 1] = self.source[line_index + 1].lstrip() + return [line_index + 1, line_index + 2] # Line indexed at 1 + + self.source[result['line'] - 1] = fixed + + def fix_e262(self, result): + """Fix spacing after comment hash.""" + target = self.source[result['line'] - 1] + offset = result['column'] + + code = target[:offset].rstrip(' \t#') + comment = target[offset:].lstrip(' \t#') + + fixed = code + (' # ' + comment if comment.strip() else '\n') + + self.source[result['line'] - 1] = fixed + + def fix_e271(self, result): + """Fix extraneous whitespace around keywords.""" + line_index = result['line'] - 1 + target = self.source[line_index] + offset = result['column'] - 1 + + if is_probably_part_of_multiline(target): + return [] + + fixed = fix_whitespace(target, + offset=offset, + replacement=' ') + + if fixed == target: + return [] + else: + self.source[line_index] = fixed + + def fix_e301(self, result): + """Add missing blank line.""" + cr = '\n' + self.source[result['line'] - 1] = cr + self.source[result['line'] - 1] + + def fix_e302(self, result): + """Add missing 2 blank lines.""" + add_linenum = 2 - int(result['info'].split()[-1]) + cr = '\n' * add_linenum + self.source[result['line'] - 1] = cr + self.source[result['line'] - 1] + + def fix_e303(self, result): + """Remove extra blank lines.""" + delete_linenum = int(result['info'].split('(')[1].split(')')[0]) - 2 + delete_linenum = max(1, delete_linenum) + + # We need to count because pep8 reports an offset line number if there + # are comments. + cnt = 0 + line = result['line'] - 2 + modified_lines = [] + while cnt < delete_linenum and line >= 0: + if not self.source[line].strip(): + self.source[line] = '' + modified_lines.append(1 + line) # Line indexed at 1 + cnt += 1 + line -= 1 + + return modified_lines + + def fix_e304(self, result): + """Remove blank line following function decorator.""" + line = result['line'] - 2 + if not self.source[line].strip(): + self.source[line] = '' + + def fix_e401(self, result): + """Put imports on separate lines.""" + line_index = result['line'] - 1 + target = self.source[line_index] + offset = result['column'] - 1 + + if not target.lstrip().startswith('import'): + return [] + + indentation = re.split(pattern=r'\bimport\b', + string=target, maxsplit=1)[0] + fixed = (target[:offset].rstrip('\t ,') + '\n' + + indentation + 'import ' + target[offset:].lstrip('\t ,')) + self.source[line_index] = fixed + + def fix_long_line_logically(self, result, logical): + """Try to make lines fit within --max-line-length characters.""" + if ( + not logical or + len(logical[2]) == 1 or + self.source[result['line'] - 1].lstrip().startswith('#') + ): + return self.fix_long_line_physically(result) + + start_line_index = logical[0][0] + end_line_index = logical[1][0] + logical_lines = logical[2] + + previous_line = get_item(self.source, start_line_index - 1, default='') + next_line = get_item(self.source, end_line_index + 1, default='') + + single_line = join_logical_line(''.join(logical_lines)) + + try: + fixed = self.fix_long_line( + target=single_line, + previous_line=previous_line, + next_line=next_line, + original=''.join(logical_lines)) + except (SyntaxError, tokenize.TokenError): + return self.fix_long_line_physically(result) + + if fixed: + for line_index in range(start_line_index, end_line_index + 1): + self.source[line_index] = '' + self.source[start_line_index] = fixed + return range(start_line_index + 1, end_line_index + 1) + else: + return [] + + def fix_long_line_physically(self, result): + """Try to make lines fit within --max-line-length characters.""" + line_index = result['line'] - 1 + target = self.source[line_index] + + previous_line = get_item(self.source, line_index - 1, default='') + next_line = get_item(self.source, line_index + 1, default='') + + try: + fixed = self.fix_long_line( + target=target, + previous_line=previous_line, + next_line=next_line, + original=target) + except (SyntaxError, tokenize.TokenError): + return [] + + if fixed: + self.source[line_index] = fixed + return [line_index + 1] + else: + return [] + + def fix_long_line(self, target, previous_line, + next_line, original): + cache_entry = (target, previous_line, next_line) + if cache_entry in self.long_line_ignore_cache: + return [] + + if target.lstrip().startswith('#'): + # Wrap commented lines. + return shorten_comment( + line=target, + max_line_length=self.options.max_line_length, + last_comment=not next_line.lstrip().startswith('#')) + + fixed = get_fixed_long_line( + target=target, + previous_line=previous_line, + original=original, + indent_word=self.indent_word, + max_line_length=self.options.max_line_length, + aggressive=self.options.aggressive, + experimental=self.options.experimental, + verbose=self.options.verbose) + if fixed and not code_almost_equal(original, fixed): + return fixed + else: + self.long_line_ignore_cache.add(cache_entry) + return None + + def fix_e502(self, result): + """Remove extraneous escape of newline.""" + line_index = result['line'] - 1 + target = self.source[line_index] + self.source[line_index] = target.rstrip('\n\r \t\\') + '\n' + + def fix_e701(self, result): + """Put colon-separated compound statement on separate lines.""" + line_index = result['line'] - 1 + target = self.source[line_index] + c = result['column'] + + fixed_source = (target[:c] + '\n' + + _get_indentation(target) + self.indent_word + + target[c:].lstrip('\n\r \t\\')) + self.source[result['line'] - 1] = fixed_source + return [result['line'], result['line'] + 1] + + def fix_e702(self, result, logical): + """Put semicolon-separated compound statement on separate lines.""" + if not logical: + return [] # pragma: no cover + logical_lines = logical[2] + + line_index = result['line'] - 1 + target = self.source[line_index] + + if target.rstrip().endswith('\\'): + # Normalize '1; \\\n2' into '1; 2'. + self.source[line_index] = target.rstrip('\n \r\t\\') + self.source[line_index + 1] = self.source[line_index + 1].lstrip() + return [line_index + 1, line_index + 2] + + if target.rstrip().endswith(';'): + self.source[line_index] = target.rstrip('\n \r\t;') + '\n' + return [line_index + 1] + + offset = result['column'] - 1 + first = target[:offset].rstrip(';').rstrip() + second = (_get_indentation(logical_lines[0]) + + target[offset:].lstrip(';').lstrip()) + + self.source[line_index] = first + '\n' + second + return [line_index + 1] + + def fix_e711(self, result): + """Fix comparison with None.""" + line_index = result['line'] - 1 + target = self.source[line_index] + offset = result['column'] - 1 + + right_offset = offset + 2 + if right_offset >= len(target): + return [] + + left = target[:offset].rstrip() + center = target[offset:right_offset] + right = target[right_offset:].lstrip() + + if not right.startswith('None'): + return [] + + if center.strip() == '==': + new_center = 'is' + elif center.strip() == '!=': + new_center = 'is not' + else: + return [] + + self.source[line_index] = ' '.join([left, new_center, right]) + + def fix_e712(self, result): + """Fix comparison with boolean.""" + line_index = result['line'] - 1 + target = self.source[line_index] + offset = result['column'] - 1 + + # Handle very easy "not" special cases. + if re.match(r'^\s*if \w+ == False:$', target): + self.source[line_index] = re.sub(r'if (\w+) == False:', + r'if not \1:', target, count=1) + elif re.match(r'^\s*if \w+ != True:$', target): + self.source[line_index] = re.sub(r'if (\w+) != True:', + r'if not \1:', target, count=1) + else: + right_offset = offset + 2 + if right_offset >= len(target): + return [] + + left = target[:offset].rstrip() + center = target[offset:right_offset] + right = target[right_offset:].lstrip() + + # Handle simple cases only. + new_right = None + if center.strip() == '==': + if re.match(r'\bTrue\b', right): + new_right = re.sub(r'\bTrue\b *', '', right, count=1) + elif center.strip() == '!=': + if re.match(r'\bFalse\b', right): + new_right = re.sub(r'\bFalse\b *', '', right, count=1) + + if new_right is None: + return [] + + if new_right[0].isalnum(): + new_right = ' ' + new_right + + self.source[line_index] = left + new_right + + def fix_e713(self, result): + """Fix non-membership check.""" + line_index = result['line'] - 1 + target = self.source[line_index] + + # Handle very easy case only. + if re.match(r'^\s*if not \w+ in \w+:$', target): + self.source[line_index] = re.sub(r'if not (\w+) in (\w+):', + r'if \1 not in \2:', + target, + count=1) + + def fix_w291(self, result): + """Remove trailing whitespace.""" + fixed_line = self.source[result['line'] - 1].rstrip() + self.source[result['line'] - 1] = fixed_line + '\n' + + +def get_fixed_long_line(target, previous_line, original, + indent_word=' ', max_line_length=79, + aggressive=False, experimental=False, verbose=False): + """Break up long line and return result. + + Do this by generating multiple reformatted candidates and then + ranking the candidates to heuristically select the best option. + + """ + indent = _get_indentation(target) + source = target[len(indent):] + assert source.lstrip() == source + + # Check for partial multiline. + tokens = list(generate_tokens(source)) + + candidates = shorten_line( + tokens, source, indent, + indent_word, + max_line_length, + aggressive=aggressive, + experimental=experimental, + previous_line=previous_line) + + # Also sort alphabetically as a tie breaker (for determinism). + candidates = sorted( + sorted(set(candidates).union([target, original])), + key=lambda x: line_shortening_rank(x, + indent_word, + max_line_length, + experimental)) + + if verbose >= 4: + print(('-' * 79 + '\n').join([''] + candidates + ['']), + file=codecs.getwriter('utf-8')(sys.stderr.buffer + if hasattr(sys.stderr, + 'buffer') + else sys.stderr)) + + if candidates: + return candidates[0] + + +def join_logical_line(logical_line): + """Return single line based on logical line input.""" + indentation = _get_indentation(logical_line) + + return indentation + untokenize_without_newlines( + generate_tokens(logical_line.lstrip())) + '\n' + + +def untokenize_without_newlines(tokens): + """Return source code based on tokens.""" + text = '' + last_row = 0 + last_column = -1 + + for t in tokens: + token_string = t[1] + (start_row, start_column) = t[2] + (end_row, end_column) = t[3] + + if start_row > last_row: + last_column = 0 + if ( + (start_column > last_column or token_string == '\n') and + not text.endswith(' ') + ): + text += ' ' + + if token_string != '\n': + text += token_string + + last_row = end_row + last_column = end_column + + return text + + +def _find_logical(source_lines): + # Make a variable which is the index of all the starts of lines. + logical_start = [] + logical_end = [] + last_newline = True + parens = 0 + for t in generate_tokens(''.join(source_lines)): + if t[0] in [tokenize.COMMENT, tokenize.DEDENT, + tokenize.INDENT, tokenize.NL, + tokenize.ENDMARKER]: + continue + if not parens and t[0] in [tokenize.NEWLINE, tokenize.SEMI]: + last_newline = True + logical_end.append((t[3][0] - 1, t[2][1])) + continue + if last_newline and not parens: + logical_start.append((t[2][0] - 1, t[2][1])) + last_newline = False + if t[0] == tokenize.OP: + if t[1] in '([{': + parens += 1 + elif t[1] in '}])': + parens -= 1 + return (logical_start, logical_end) + + +def _get_logical(source_lines, result, logical_start, logical_end): + """Return the logical line corresponding to the result. + + Assumes input is already E702-clean. + + """ + row = result['line'] - 1 + col = result['column'] - 1 + ls = None + le = None + for i in range(0, len(logical_start), 1): + assert logical_end + x = logical_end[i] + if x[0] > row or (x[0] == row and x[1] > col): + le = x + ls = logical_start[i] + break + if ls is None: + return None + original = source_lines[ls[0]:le[0] + 1] + return ls, le, original + + +def get_item(items, index, default=None): + if 0 <= index < len(items): + return items[index] + else: + return default + + +def reindent(source, indent_size): + """Reindent all lines.""" + reindenter = Reindenter(source) + return reindenter.run(indent_size) + + +def code_almost_equal(a, b): + """Return True if code is similar. + + Ignore whitespace when comparing specific line. + + """ + split_a = split_and_strip_non_empty_lines(a) + split_b = split_and_strip_non_empty_lines(b) + + if len(split_a) != len(split_b): + return False + + for index in range(len(split_a)): + if ''.join(split_a[index].split()) != ''.join(split_b[index].split()): + return False + + return True + + +def split_and_strip_non_empty_lines(text): + """Return lines split by newline. + + Ignore empty lines. + + """ + return [line.strip() for line in text.splitlines() if line.strip()] + + +def fix_e265(source, aggressive=False): # pylint: disable=unused-argument + """Format block comments.""" + if '#' not in source: + # Optimization. + return source + + ignored_line_numbers = multiline_string_lines( + source, + include_docstrings=True) | set(commented_out_code_lines(source)) + + fixed_lines = [] + sio = io.StringIO(source) + line_number = 0 + for line in sio.readlines(): + line_number += 1 + if ( + line.lstrip().startswith('#') and + line_number not in ignored_line_numbers + ): + indentation = _get_indentation(line) + line = line.lstrip() + + # Normalize beginning if not a shebang. + if len(line) > 1: + if ( + # Leave multiple spaces like '# ' alone. + (line.count('#') > 1 or line[1].isalnum()) + # Leave stylistic outlined blocks alone. + and not line.rstrip().endswith('#') + ): + line = '# ' + line.lstrip('# \t') + + fixed_lines.append(indentation + line) + else: + fixed_lines.append(line) + + return ''.join(fixed_lines) + + +def refactor(source, fixer_names, ignore=None): + """Return refactored code using lib2to3. + + Skip if ignore string is produced in the refactored code. + + """ + check_lib2to3() + from lib2to3 import pgen2 + try: + new_text = refactor_with_2to3(source, + fixer_names=fixer_names) + except (pgen2.parse.ParseError, + SyntaxError, + UnicodeDecodeError, + UnicodeEncodeError): + return source + + if ignore: + if ignore in new_text and ignore not in source: + return source + + return new_text + + +def code_to_2to3(select, ignore): + fixes = set() + for code, fix in CODE_TO_2TO3.items(): + if code_match(code, select=select, ignore=ignore): + fixes |= set(fix) + return fixes + + +def fix_2to3(source, aggressive=True, select=None, ignore=None): + """Fix various deprecated code (via lib2to3).""" + if not aggressive: + return source + + select = select or [] + ignore = ignore or [] + + return refactor(source, + code_to_2to3(select=select, + ignore=ignore)) + + +def fix_w602(source, aggressive=True): + """Fix deprecated form of raising exception.""" + if not aggressive: + return source + + return refactor(source, ['raise'], + ignore='with_traceback') + + +def find_newline(source): + """Return type of newline used in source. + + Input is a list of lines. + + """ + assert not isinstance(source, unicode) + + counter = collections.defaultdict(int) + for line in source: + if line.endswith(CRLF): + counter[CRLF] += 1 + elif line.endswith(CR): + counter[CR] += 1 + elif line.endswith(LF): + counter[LF] += 1 + + return (sorted(counter, key=counter.get, reverse=True) or [LF])[0] + + +def _get_indentword(source): + """Return indentation type.""" + indent_word = ' ' # Default in case source has no indentation + try: + for t in generate_tokens(source): + if t[0] == token.INDENT: + indent_word = t[1] + break + except (SyntaxError, tokenize.TokenError): + pass + return indent_word + + +def _get_indentation(line): + """Return leading whitespace.""" + if line.strip(): + non_whitespace_index = len(line) - len(line.lstrip()) + return line[:non_whitespace_index] + else: + return '' + + +def get_diff_text(old, new, filename): + """Return text of unified diff between old and new.""" + newline = '\n' + diff = difflib.unified_diff( + old, new, + 'original/' + filename, + 'fixed/' + filename, + lineterm=newline) + + text = '' + for line in diff: + text += line + + # Work around missing newline (http://bugs.python.org/issue2142). + if text and not line.endswith(newline): + text += newline + r'\ No newline at end of file' + newline + + return text + + +def _priority_key(pep8_result): + """Key for sorting PEP8 results. + + Global fixes should be done first. This is important for things like + indentation. + + """ + priority = [ + # Fix multiline colon-based before semicolon based. + 'e701', + # Break multiline statements early. + 'e702', + # Things that make lines longer. + 'e225', 'e231', + # Remove extraneous whitespace before breaking lines. + 'e201', + # Shorten whitespace in comment before resorting to wrapping. + 'e262' + ] + middle_index = 10000 + lowest_priority = [ + # We need to shorten lines last since the logical fixer can get in a + # loop, which causes us to exit early. + 'e501' + ] + key = pep8_result['id'].lower() + try: + return priority.index(key) + except ValueError: + try: + return middle_index + lowest_priority.index(key) + 1 + except ValueError: + return middle_index + + +def shorten_line(tokens, source, indentation, indent_word, max_line_length, + aggressive=False, experimental=False, previous_line=''): + """Separate line at OPERATOR. + + Multiple candidates will be yielded. + + """ + for candidate in _shorten_line(tokens=tokens, + source=source, + indentation=indentation, + indent_word=indent_word, + aggressive=aggressive, + previous_line=previous_line): + yield candidate + + if aggressive: + for key_token_strings in SHORTEN_OPERATOR_GROUPS: + shortened = _shorten_line_at_tokens( + tokens=tokens, + source=source, + indentation=indentation, + indent_word=indent_word, + key_token_strings=key_token_strings, + aggressive=aggressive) + + if shortened is not None and shortened != source: + yield shortened + + if experimental: + for shortened in _shorten_line_at_tokens_new( + tokens=tokens, + source=source, + indentation=indentation, + max_line_length=max_line_length): + + yield shortened + + +def _shorten_line(tokens, source, indentation, indent_word, + aggressive=False, previous_line=''): + """Separate line at OPERATOR. + + The input is expected to be free of newlines except for inside multiline + strings and at the end. + + Multiple candidates will be yielded. + + """ + for (token_type, + token_string, + start_offset, + end_offset) in token_offsets(tokens): + + if ( + token_type == tokenize.COMMENT and + not is_probably_part_of_multiline(previous_line) and + not is_probably_part_of_multiline(source) and + not source[start_offset + 1:].strip().lower().startswith( + ('noqa', 'pragma:', 'pylint:')) + ): + # Move inline comments to previous line. + first = source[:start_offset] + second = source[start_offset:] + yield (indentation + second.strip() + '\n' + + indentation + first.strip() + '\n') + elif token_type == token.OP and token_string != '=': + # Don't break on '=' after keyword as this violates PEP 8. + + assert token_type != token.INDENT + + first = source[:end_offset] + + second_indent = indentation + if first.rstrip().endswith('('): + second_indent += indent_word + elif '(' in first: + second_indent += ' ' * (1 + first.find('(')) + else: + second_indent += indent_word + + second = (second_indent + source[end_offset:].lstrip()) + if ( + not second.strip() or + second.lstrip().startswith('#') + ): + continue + + # Do not begin a line with a comma + if second.lstrip().startswith(','): + continue + # Do end a line with a dot + if first.rstrip().endswith('.'): + continue + if token_string in '+-*/': + fixed = first + ' \\' + '\n' + second + else: + fixed = first + '\n' + second + + # Only fix if syntax is okay. + if check_syntax(normalize_multiline(fixed) + if aggressive else fixed): + yield indentation + fixed + + +# A convenient way to handle tokens. +Token = collections.namedtuple('Token', ['token_type', 'token_string', + 'spos', 'epos', 'line']) + + +class ReformattedLines(object): + + """The reflowed lines of atoms. + + Each part of the line is represented as an "atom." They can be moved + around when need be to get the optimal formatting. + + """ + + ########################################################################### + # Private Classes + + class _Indent(object): + + """Represent an indentation in the atom stream.""" + + def __init__(self, indent_amt): + self._indent_amt = indent_amt + + def emit(self): + return ' ' * self._indent_amt + + @property + def size(self): + return self._indent_amt + + class _Space(object): + + """Represent a space in the atom stream.""" + + def emit(self): + return ' ' + + @property + def size(self): + return 1 + + class _LineBreak(object): + + """Represent a line break in the atom stream.""" + + def emit(self): + return '\n' + + @property + def size(self): + return 0 + + def __init__(self, max_line_length): + self._max_line_length = max_line_length + self._lines = [] + self._bracket_depth = 0 + self._prev_item = None + self._prev_prev_item = None + + def __repr__(self): + return self.emit() + + ########################################################################### + # Public Methods + + def add(self, obj, indent_amt, break_after_open_bracket): + if isinstance(obj, Atom): + self._add_item(obj, indent_amt) + return + + self._add_container(obj, indent_amt, break_after_open_bracket) + + def add_comment(self, item): + num_spaces = 2 + if len(self._lines) > 1: + if isinstance(self._lines[-1], self._Space): + num_spaces -= 1 + if len(self._lines) > 2: + if isinstance(self._lines[-2], self._Space): + num_spaces -= 1 + + while num_spaces > 0: + self._lines.append(self._Space()) + num_spaces -= 1 + self._lines.append(item) + + def add_indent(self, indent_amt): + self._lines.append(self._Indent(indent_amt)) + + def add_line_break(self, indent): + self._lines.append(self._LineBreak()) + self.add_indent(len(indent)) + + def add_line_break_at(self, index, indent_amt): + self._lines.insert(index, self._LineBreak()) + self._lines.insert(index + 1, self._Indent(indent_amt)) + + def add_space_if_needed(self, curr_text, equal=False): + if ( + not self._lines or isinstance( + self._lines[-1], (self._LineBreak, self._Indent, self._Space)) + ): + return + + prev_text = unicode(self._prev_item) + prev_prev_text = ( + unicode(self._prev_prev_item) if self._prev_prev_item else '') + + if ( + # The previous item was a keyword or identifier and the current + # item isn't an operator that doesn't require a space. + ((self._prev_item.is_keyword or self._prev_item.is_string or + self._prev_item.is_name or self._prev_item.is_number) and + (curr_text[0] not in '([{.,:}])' or + (curr_text[0] == '=' and equal))) or + + # Don't place spaces around a '.', unless it's in an 'import' + # statement. + ((prev_prev_text != 'from' and prev_text[-1] != '.' and + curr_text != 'import') and + + # Don't place a space before a colon. + curr_text[0] != ':' and + + # Don't split up ending brackets by spaces. + ((prev_text[-1] in '}])' and curr_text[0] not in '.,}])') or + + # Put a space after a colon or comma. + prev_text[-1] in ':,' or + + # Put space around '=' if asked to. + (equal and prev_text == '=') or + + # Put spaces around non-unary arithmetic operators. + ((self._prev_prev_item and + (prev_text not in '+-' and + (self._prev_prev_item.is_name or + self._prev_prev_item.is_number or + self._prev_prev_item.is_string)) and + prev_text in ('+', '-', '%', '*', '/', '//', '**'))))) + ): + self._lines.append(self._Space()) + + def previous_item(self): + """Return the previous non-whitespace item.""" + return self._prev_item + + def fits_on_current_line(self, item_extent): + return self.current_size() + item_extent <= self._max_line_length + + def current_size(self): + """The size of the current line minus the indentation.""" + size = 0 + for item in reversed(self._lines): + size += item.size + if isinstance(item, self._LineBreak): + break + + return size + + def line_empty(self): + return (self._lines and + isinstance(self._lines[-1], + (self._LineBreak, self._Indent))) + + def emit(self): + string = '' + for item in self._lines: + if isinstance(item, self._LineBreak): + string = string.rstrip() + string += item.emit() + + return string.rstrip() + '\n' + + ########################################################################### + # Private Methods + + def _add_item(self, item, indent_amt): + """Add an item to the line. + + Reflow the line to get the best formatting after the item is + inserted. The bracket depth indicates if the item is being + inserted inside of a container or not. + + """ + if self._prev_item and self._prev_item.is_string and item.is_string: + # Place consecutive string literals on separate lines. + self._lines.append(self._LineBreak()) + self._lines.append(self._Indent(indent_amt)) + + item_text = unicode(item) + if self._lines and self._bracket_depth: + # Adding the item into a container. + self._prevent_default_initializer_splitting(item, indent_amt) + + if item_text in '.,)]}': + self._split_after_delimiter(item, indent_amt) + + elif self._lines and not self.line_empty(): + # Adding the item outside of a container. + if self.fits_on_current_line(len(item_text)): + self._enforce_space(item) + + else: + # Line break for the new item. + self._lines.append(self._LineBreak()) + self._lines.append(self._Indent(indent_amt)) + + self._lines.append(item) + self._prev_item, self._prev_prev_item = item, self._prev_item + + if item_text in '([{': + self._bracket_depth += 1 + + elif item_text in '}])': + self._bracket_depth -= 1 + assert self._bracket_depth >= 0 + + def _add_container(self, container, indent_amt, break_after_open_bracket): + actual_indent = indent_amt + 1 + + if ( + unicode(self._prev_item) != '=' and + not self.line_empty() and + not self.fits_on_current_line( + container.size + self._bracket_depth + 2) + ): + + if unicode(container)[0] == '(' and self._prev_item.is_name: + # Don't split before the opening bracket of a call. + break_after_open_bracket = True + actual_indent = indent_amt + 4 + elif ( + break_after_open_bracket or + unicode(self._prev_item) not in '([{' + ): + # If the container doesn't fit on the current line and the + # current line isn't empty, place the container on the next + # line. + self._lines.append(self._LineBreak()) + self._lines.append(self._Indent(indent_amt)) + break_after_open_bracket = False + else: + actual_indent = self.current_size() + 1 + break_after_open_bracket = False + + if isinstance(container, (ListComprehension, IfExpression)): + actual_indent = indent_amt + + # Increase the continued indentation only if recursing on a + # container. + container.reflow(self, ' ' * actual_indent, + break_after_open_bracket=break_after_open_bracket) + + def _prevent_default_initializer_splitting(self, item, indent_amt): + """Prevent splitting between a default initializer. + + When there is a default initializer, it's best to keep it all on + the same line. It's nicer and more readable, even if it goes + over the maximum allowable line length. This goes back along the + current line to determine if we have a default initializer, and, + if so, to remove extraneous whitespaces and add a line + break/indent before it if needed. + + """ + if unicode(item) == '=': + # This is the assignment in the initializer. Just remove spaces for + # now. + self._delete_whitespace() + return + + if (not self._prev_item or not self._prev_prev_item or + unicode(self._prev_item) != '='): + return + + self._delete_whitespace() + prev_prev_index = self._lines.index(self._prev_prev_item) + + if ( + isinstance(self._lines[prev_prev_index - 1], self._Indent) or + self.fits_on_current_line(item.size + 1) + ): + # The default initializer is already the only item on this line. + # Don't insert a newline here. + return + + # Replace the space with a newline/indent combo. + if isinstance(self._lines[prev_prev_index - 1], self._Space): + del self._lines[prev_prev_index - 1] + + self.add_line_break_at(self._lines.index(self._prev_prev_item), + indent_amt) + + def _split_after_delimiter(self, item, indent_amt): + """Split the line only after a delimiter.""" + self._delete_whitespace() + + if self.fits_on_current_line(item.size): + return + + last_space = None + for item in reversed(self._lines): + if ( + last_space and + (not isinstance(item, Atom) or not item.is_colon) + ): + break + else: + last_space = None + if isinstance(item, self._Space): + last_space = item + if isinstance(item, (self._LineBreak, self._Indent)): + return + + if not last_space: + return + + self.add_line_break_at(self._lines.index(last_space), indent_amt) + + def _enforce_space(self, item): + """Enforce a space in certain situations. + + There are cases where we will want a space where normally we + wouldn't put one. This just enforces the addition of a space. + + """ + if isinstance(self._lines[-1], + (self._Space, self._LineBreak, self._Indent)): + return + + if not self._prev_item: + return + + item_text = unicode(item) + prev_text = unicode(self._prev_item) + + # Prefer a space around a '.' in an import statement, and between the + # 'import' and '('. + if ( + (item_text == '.' and prev_text == 'from') or + (item_text == 'import' and prev_text == '.') or + (item_text == '(' and prev_text == 'import') + ): + self._lines.append(self._Space()) + + def _delete_whitespace(self): + """Delete all whitespace from the end of the line.""" + while isinstance(self._lines[-1], (self._Space, self._LineBreak, + self._Indent)): + del self._lines[-1] + + +class Atom(object): + + """The smallest unbreakable unit that can be reflowed.""" + + def __init__(self, atom): + self._atom = atom + + def __repr__(self): + return self._atom.token_string + + def __len__(self): + return self.size + + def reflow( + self, reflowed_lines, continued_indent, extent, + break_after_open_bracket=False, + is_list_comp_or_if_expr=False, + next_is_dot=False + ): + if self._atom.token_type == tokenize.COMMENT: + reflowed_lines.add_comment(self) + return + + total_size = extent if extent else self.size + + if self._atom.token_string not in ',:([{}])': + # Some atoms will need an extra 1-sized space token after them. + total_size += 1 + + prev_item = reflowed_lines.previous_item() + if ( + not is_list_comp_or_if_expr and + not reflowed_lines.fits_on_current_line(total_size) and + not (next_is_dot and + reflowed_lines.fits_on_current_line(self.size + 1)) and + not reflowed_lines.line_empty() and + not self.is_colon and + not (prev_item and prev_item.is_name and + unicode(self) == '(') + ): + # Start a new line if there is already something on the line and + # adding this atom would make it go over the max line length. + reflowed_lines.add_line_break(continued_indent) + else: + reflowed_lines.add_space_if_needed(unicode(self)) + + reflowed_lines.add(self, len(continued_indent), + break_after_open_bracket) + + def emit(self): + return self.__repr__() + + @property + def is_keyword(self): + return keyword.iskeyword(self._atom.token_string) + + @property + def is_string(self): + return self._atom.token_type == tokenize.STRING + + @property + def is_name(self): + return self._atom.token_type == tokenize.NAME + + @property + def is_number(self): + return self._atom.token_type == tokenize.NUMBER + + @property + def is_comma(self): + return self._atom.token_string == ',' + + @property + def is_colon(self): + return self._atom.token_string == ':' + + @property + def size(self): + return len(self._atom.token_string) + + +class Container(object): + + """Base class for all container types.""" + + def __init__(self, items): + self._items = items + + def __repr__(self): + string = '' + last_was_keyword = False + + for item in self._items: + if item.is_comma: + string += ', ' + elif item.is_colon: + string += ': ' + else: + item_string = unicode(item) + if ( + string and + (last_was_keyword or + (not string.endswith(tuple('([{,.:}]) ')) and + not item_string.startswith(tuple('([{,.:}])')))) + ): + string += ' ' + string += item_string + + last_was_keyword = item.is_keyword + return string + + def __iter__(self): + for element in self._items: + yield element + + def __getitem__(self, idx): + return self._items[idx] + + def reflow(self, reflowed_lines, continued_indent, + break_after_open_bracket=False): + last_was_container = False + for (index, item) in enumerate(self._items): + next_item = get_item(self._items, index + 1) + + if isinstance(item, Atom): + is_list_comp_or_if_expr = ( + isinstance(self, (ListComprehension, IfExpression))) + item.reflow(reflowed_lines, continued_indent, + self._get_extent(index), + is_list_comp_or_if_expr=is_list_comp_or_if_expr, + next_is_dot=(next_item and + unicode(next_item) == '.')) + if last_was_container and item.is_comma: + reflowed_lines.add_line_break(continued_indent) + last_was_container = False + else: # isinstance(item, Container) + reflowed_lines.add(item, len(continued_indent), + break_after_open_bracket) + last_was_container = not isinstance(item, (ListComprehension, + IfExpression)) + + if ( + break_after_open_bracket and index == 0 and + # Prefer to keep empty containers together instead of + # separating them. + unicode(item) == self.open_bracket and + (not next_item or unicode(next_item) != self.close_bracket) and + (len(self._items) != 3 or not isinstance(next_item, Atom)) + ): + reflowed_lines.add_line_break(continued_indent) + break_after_open_bracket = False + else: + next_next_item = get_item(self._items, index + 2) + if ( + unicode(item) not in ['.', '%', 'in'] and + next_item and not isinstance(next_item, Container) and + unicode(next_item) != ':' and + next_next_item and (not isinstance(next_next_item, Atom) or + unicode(next_item) == 'not') and + not reflowed_lines.line_empty() and + not reflowed_lines.fits_on_current_line( + self._get_extent(index + 1) + 2) + ): + reflowed_lines.add_line_break(continued_indent) + + def _get_extent(self, index): + """The extent of the full element. + + E.g., the length of a function call or keyword. + + """ + extent = 0 + prev_item = get_item(self._items, index - 1) + seen_dot = prev_item and unicode(prev_item) == '.' + while index < len(self._items): + item = get_item(self._items, index) + index += 1 + + if isinstance(item, (ListComprehension, IfExpression)): + break + + if isinstance(item, Container): + if prev_item and prev_item.is_name: + if seen_dot: + extent += 1 + else: + extent += item.size + + prev_item = item + continue + elif (unicode(item) not in ['.', '=', ':', 'not'] and + not item.is_name and not item.is_string): + break + + if unicode(item) == '.': + seen_dot = True + + extent += item.size + prev_item = item + + return extent + + @property + def is_string(self): + return False + + @property + def size(self): + return len(self.__repr__()) + + @property + def is_keyword(self): + return False + + @property + def is_name(self): + return False + + @property + def is_comma(self): + return False + + @property + def is_colon(self): + return False + + @property + def open_bracket(self): + return None + + @property + def close_bracket(self): + return None + + +class Tuple(Container): + + """A high-level representation of a tuple.""" + + @property + def open_bracket(self): + return '(' + + @property + def close_bracket(self): + return ')' + + +class List(Container): + + """A high-level representation of a list.""" + + @property + def open_bracket(self): + return '[' + + @property + def close_bracket(self): + return ']' + + +class DictOrSet(Container): + + """A high-level representation of a dictionary or set.""" + + @property + def open_bracket(self): + return '{' + + @property + def close_bracket(self): + return '}' + + +class ListComprehension(Container): + + """A high-level representation of a list comprehension.""" + + @property + def size(self): + length = 0 + for item in self._items: + if isinstance(item, IfExpression): + break + length += item.size + return length + + +class IfExpression(Container): + + """A high-level representation of an if-expression.""" + + +def _parse_container(tokens, index, for_or_if=None): + """Parse a high-level container, such as a list, tuple, etc.""" + + # Store the opening bracket. + items = [Atom(Token(*tokens[index]))] + index += 1 + + num_tokens = len(tokens) + while index < num_tokens: + tok = Token(*tokens[index]) + + if tok.token_string in ',)]}': + # First check if we're at the end of a list comprehension or + # if-expression. Don't add the ending token as part of the list + # comprehension or if-expression, because they aren't part of those + # constructs. + if for_or_if == 'for': + return (ListComprehension(items), index - 1) + + elif for_or_if == 'if': + return (IfExpression(items), index - 1) + + # We've reached the end of a container. + items.append(Atom(tok)) + + # If not, then we are at the end of a container. + if tok.token_string == ')': + # The end of a tuple. + return (Tuple(items), index) + + elif tok.token_string == ']': + # The end of a list. + return (List(items), index) + + elif tok.token_string == '}': + # The end of a dictionary or set. + return (DictOrSet(items), index) + + elif tok.token_string in '([{': + # A sub-container is being defined. + (container, index) = _parse_container(tokens, index) + items.append(container) + + elif tok.token_string == 'for': + (container, index) = _parse_container(tokens, index, 'for') + items.append(container) + + elif tok.token_string == 'if': + (container, index) = _parse_container(tokens, index, 'if') + items.append(container) + + else: + items.append(Atom(tok)) + + index += 1 + + return (None, None) + + +def _parse_tokens(tokens): + """Parse the tokens. + + This converts the tokens into a form where we can manipulate them + more easily. + + """ + + index = 0 + parsed_tokens = [] + + num_tokens = len(tokens) + while index < num_tokens: + tok = Token(*tokens[index]) + + assert tok.token_type != token.INDENT + if tok.token_type == tokenize.NEWLINE: + # There's only one newline and it's at the end. + break + + if tok.token_string in '([{': + (container, index) = _parse_container(tokens, index) + if not container: + return None + parsed_tokens.append(container) + else: + parsed_tokens.append(Atom(tok)) + + index += 1 + + return parsed_tokens + + +def _reflow_lines(parsed_tokens, indentation, max_line_length, + start_on_prefix_line): + """Reflow the lines so that it looks nice.""" + + if unicode(parsed_tokens[0]) == 'def': + # A function definition gets indented a bit more. + continued_indent = indentation + ' ' * 2 * DEFAULT_INDENT_SIZE + else: + continued_indent = indentation + ' ' * DEFAULT_INDENT_SIZE + + break_after_open_bracket = not start_on_prefix_line + + lines = ReformattedLines(max_line_length) + lines.add_indent(len(indentation.lstrip('\r\n'))) + + if not start_on_prefix_line: + # If splitting after the opening bracket will cause the first element + # to be aligned weirdly, don't try it. + first_token = get_item(parsed_tokens, 0) + second_token = get_item(parsed_tokens, 1) + + if ( + first_token and second_token and + unicode(second_token)[0] == '(' and + len(indentation) + len(first_token) + 1 == len(continued_indent) + ): + return None + + for item in parsed_tokens: + lines.add_space_if_needed(unicode(item), equal=True) + + save_continued_indent = continued_indent + if start_on_prefix_line and isinstance(item, Container): + start_on_prefix_line = False + continued_indent = ' ' * (lines.current_size() + 1) + + item.reflow(lines, continued_indent, break_after_open_bracket) + continued_indent = save_continued_indent + + return lines.emit() + + +def _shorten_line_at_tokens_new(tokens, source, indentation, + max_line_length): + """Shorten the line taking its length into account. + + The input is expected to be free of newlines except for inside + multiline strings and at the end. + + """ + # Yield the original source so to see if it's a better choice than the + # shortened candidate lines we generate here. + yield indentation + source + + parsed_tokens = _parse_tokens(tokens) + + if parsed_tokens: + # Perform two reflows. The first one starts on the same line as the + # prefix. The second starts on the line after the prefix. + fixed = _reflow_lines(parsed_tokens, indentation, max_line_length, + start_on_prefix_line=True) + if fixed and check_syntax(normalize_multiline(fixed.lstrip())): + yield fixed + + fixed = _reflow_lines(parsed_tokens, indentation, max_line_length, + start_on_prefix_line=False) + if fixed and check_syntax(normalize_multiline(fixed.lstrip())): + yield fixed + + +def _shorten_line_at_tokens(tokens, source, indentation, indent_word, + key_token_strings, aggressive): + """Separate line by breaking at tokens in key_token_strings. + + The input is expected to be free of newlines except for inside + multiline strings and at the end. + + """ + offsets = [] + for (index, _t) in enumerate(token_offsets(tokens)): + (token_type, + token_string, + start_offset, + end_offset) = _t + + assert token_type != token.INDENT + + if token_string in key_token_strings: + # Do not break in containers with zero or one items. + unwanted_next_token = { + '(': ')', + '[': ']', + '{': '}'}.get(token_string) + if unwanted_next_token: + if ( + get_item(tokens, + index + 1, + default=[None, None])[1] == unwanted_next_token or + get_item(tokens, + index + 2, + default=[None, None])[1] == unwanted_next_token + ): + continue + + if ( + index > 2 and token_string == '(' and + tokens[index - 1][1] in ',(%[' + ): + # Don't split after a tuple start, or before a tuple start if + # the tuple is in a list. + continue + + if end_offset < len(source) - 1: + # Don't split right before newline. + offsets.append(end_offset) + else: + # Break at adjacent strings. These were probably meant to be on + # separate lines in the first place. + previous_token = get_item(tokens, index - 1) + if ( + token_type == tokenize.STRING and + previous_token and previous_token[0] == tokenize.STRING + ): + offsets.append(start_offset) + + current_indent = None + fixed = None + for line in split_at_offsets(source, offsets): + if fixed: + fixed += '\n' + current_indent + line + + for symbol in '([{': + if line.endswith(symbol): + current_indent += indent_word + else: + # First line. + fixed = line + assert not current_indent + current_indent = indent_word + + assert fixed is not None + + if check_syntax(normalize_multiline(fixed) + if aggressive > 1 else fixed): + return indentation + fixed + else: + return None + + +def token_offsets(tokens): + """Yield tokens and offsets.""" + end_offset = 0 + previous_end_row = 0 + previous_end_column = 0 + for t in tokens: + token_type = t[0] + token_string = t[1] + (start_row, start_column) = t[2] + (end_row, end_column) = t[3] + + # Account for the whitespace between tokens. + end_offset += start_column + if previous_end_row == start_row: + end_offset -= previous_end_column + + # Record the start offset of the token. + start_offset = end_offset + + # Account for the length of the token itself. + end_offset += len(token_string) + + yield (token_type, + token_string, + start_offset, + end_offset) + + previous_end_row = end_row + previous_end_column = end_column + + +def normalize_multiline(line): + """Normalize multiline-related code that will cause syntax error. + + This is for purposes of checking syntax. + + """ + if line.startswith('def ') and line.rstrip().endswith(':'): + return line + ' pass' + elif line.startswith('return '): + return 'def _(): ' + line + elif line.startswith('@'): + return line + 'def _(): pass' + elif line.startswith('class '): + return line + ' pass' + elif line.startswith('if '): + return line + ' pass' + else: + return line + + +def fix_whitespace(line, offset, replacement): + """Replace whitespace at offset and return fixed line.""" + # Replace escaped newlines too + left = line[:offset].rstrip('\n\r \t\\') + right = line[offset:].lstrip('\n\r \t\\') + if right.startswith('#'): + return line + else: + return left + replacement + right + + +def _execute_pep8(pep8_options, source): + """Execute pep8 via python method calls.""" + class QuietReport(pep8.BaseReport): + + """Version of checker that does not print.""" + + def __init__(self, options): + super(QuietReport, self).__init__(options) + self.__full_error_results = [] + + def error(self, line_number, offset, text, _): + """Collect errors.""" + code = super(QuietReport, self).error(line_number, offset, text, _) + if code: + self.__full_error_results.append( + {'id': code, + 'line': line_number, + 'column': offset + 1, + 'info': text}) + + def full_error_results(self): + """Return error results in detail. + + Results are in the form of a list of dictionaries. Each + dictionary contains 'id', 'line', 'column', and 'info'. + + """ + return self.__full_error_results + + checker = pep8.Checker('', lines=source, + reporter=QuietReport, **pep8_options) + checker.check_all() + return checker.report.full_error_results() + + +def _remove_leading_and_normalize(line): + return line.lstrip().rstrip(CR + LF) + '\n' + + +class Reindenter(object): + + """Reindents badly-indented code to uniformly use four-space indentation. + + Released to the public domain, by Tim Peters, 03 October 2000. + + """ + + def __init__(self, input_text): + sio = io.StringIO(input_text) + source_lines = sio.readlines() + + self.string_content_line_numbers = multiline_string_lines(input_text) + + # File lines, rstripped & tab-expanded. Dummy at start is so + # that we can use tokenize's 1-based line numbering easily. + # Note that a line is all-blank iff it is a newline. + self.lines = [] + line_number = 0 + for line in source_lines: + line_number += 1 + # Do not modify if inside a multiline string. + if line_number in self.string_content_line_numbers: + self.lines.append(line) + else: + # Only expand leading tabs. + self.lines.append(_get_indentation(line).expandtabs() + + _remove_leading_and_normalize(line)) + + self.lines.insert(0, None) + self.index = 1 # index into self.lines of next line + self.input_text = input_text + + def run(self, indent_size=DEFAULT_INDENT_SIZE): + """Fix indentation and return modified line numbers. + + Line numbers are indexed at 1. + + """ + if indent_size < 1: + return self.input_text + + try: + stats = _reindent_stats(tokenize.generate_tokens(self.getline)) + except (SyntaxError, tokenize.TokenError): + return self.input_text + # Remove trailing empty lines. + lines = self.lines + while lines and lines[-1] == '\n': + lines.pop() + # Sentinel. + stats.append((len(lines), 0)) + # Map count of leading spaces to # we want. + have2want = {} + # Program after transformation. + after = [] + # Copy over initial empty lines -- there's nothing to do until + # we see a line with *something* on it. + i = stats[0][0] + after.extend(lines[1:i]) + for i in range(len(stats) - 1): + thisstmt, thislevel = stats[i] + nextstmt = stats[i + 1][0] + have = _leading_space_count(lines[thisstmt]) + want = thislevel * indent_size + if want < 0: + # A comment line. + if have: + # An indented comment line. If we saw the same + # indentation before, reuse what it most recently + # mapped to. + want = have2want.get(have, -1) + if want < 0: + # Then it probably belongs to the next real stmt. + for j in range(i + 1, len(stats) - 1): + jline, jlevel = stats[j] + if jlevel >= 0: + if have == _leading_space_count(lines[jline]): + want = jlevel * indent_size + break + if want < 0: # Maybe it's a hanging + # comment like this one, + # in which case we should shift it like its base + # line got shifted. + for j in range(i - 1, -1, -1): + jline, jlevel = stats[j] + if jlevel >= 0: + want = (have + _leading_space_count( + after[jline - 1]) - + _leading_space_count(lines[jline])) + break + if want < 0: + # Still no luck -- leave it alone. + want = have + else: + want = 0 + assert want >= 0 + have2want[have] = want + diff = want - have + if diff == 0 or have == 0: + after.extend(lines[thisstmt:nextstmt]) + else: + line_number = thisstmt - 1 + for line in lines[thisstmt:nextstmt]: + line_number += 1 + if line_number in self.string_content_line_numbers: + after.append(line) + elif diff > 0: + if line == '\n': + after.append(line) + else: + after.append(' ' * diff + line) + else: + remove = min(_leading_space_count(line), -diff) + after.append(line[remove:]) + + return ''.join(after) + + def getline(self): + """Line-getter for tokenize.""" + if self.index >= len(self.lines): + line = '' + else: + line = self.lines[self.index] + self.index += 1 + return line + + +def _reindent_stats(tokens): + """Return list of (lineno, indentlevel) pairs. + + One for each stmt and comment line. indentlevel is -1 for comment lines, as + a signal that tokenize doesn't know what to do about them; indeed, they're + our headache! + + """ + find_stmt = 1 # Next token begins a fresh stmt? + level = 0 # Current indent level. + stats = [] + + for t in tokens: + token_type = t[0] + sline = t[2][0] + line = t[4] + + if token_type == tokenize.NEWLINE: + # A program statement, or ENDMARKER, will eventually follow, + # after some (possibly empty) run of tokens of the form + # (NL | COMMENT)* (INDENT | DEDENT+)? + find_stmt = 1 + + elif token_type == tokenize.INDENT: + find_stmt = 1 + level += 1 + + elif token_type == tokenize.DEDENT: + find_stmt = 1 + level -= 1 + + elif token_type == tokenize.COMMENT: + if find_stmt: + stats.append((sline, -1)) + # But we're still looking for a new stmt, so leave + # find_stmt alone. + + elif token_type == tokenize.NL: + pass + + elif find_stmt: + # This is the first "real token" following a NEWLINE, so it + # must be the first token of the next program statement, or an + # ENDMARKER. + find_stmt = 0 + if line: # Not endmarker. + stats.append((sline, level)) + + return stats + + +def _leading_space_count(line): + """Return number of leading spaces in line.""" + i = 0 + while i < len(line) and line[i] == ' ': + i += 1 + return i + + +def refactor_with_2to3(source_text, fixer_names): + """Use lib2to3 to refactor the source. + + Return the refactored source code. + + """ + check_lib2to3() + from lib2to3.refactor import RefactoringTool + fixers = ['lib2to3.fixes.fix_' + name for name in fixer_names] + tool = RefactoringTool(fixer_names=fixers, explicit=fixers) + + from lib2to3.pgen2 import tokenize as lib2to3_tokenize + try: + return unicode(tool.refactor_string(source_text, name='')) + except lib2to3_tokenize.TokenError: + return source_text + + +def check_syntax(code): + """Return True if syntax is okay.""" + try: + return compile(code, '', 'exec') + except (SyntaxError, TypeError, UnicodeDecodeError): + return False + + +def filter_results(source, results, aggressive): + """Filter out spurious reports from pep8. + + If aggressive is True, we allow possibly unsafe fixes (E711, E712). + + """ + non_docstring_string_line_numbers = multiline_string_lines( + source, include_docstrings=False) + all_string_line_numbers = multiline_string_lines( + source, include_docstrings=True) + + commented_out_code_line_numbers = commented_out_code_lines(source) + + for r in results: + issue_id = r['id'].lower() + + if r['line'] in non_docstring_string_line_numbers: + if issue_id.startswith(('e1', 'e501', 'w191')): + continue + + if r['line'] in all_string_line_numbers: + if issue_id in ['e501']: + continue + + # We must offset by 1 for lines that contain the trailing contents of + # multiline strings. + if not aggressive and (r['line'] + 1) in all_string_line_numbers: + # Do not modify multiline strings in non-aggressive mode. Remove + # trailing whitespace could break doctests. + if issue_id.startswith(('w29', 'w39')): + continue + + if aggressive <= 0: + if issue_id.startswith(('e711', 'w6')): + continue + + if aggressive <= 1: + if issue_id.startswith(('e712', 'e713')): + continue + + if r['line'] in commented_out_code_line_numbers: + if issue_id.startswith(('e26', 'e501')): + continue + + yield r + + +def multiline_string_lines(source, include_docstrings=False): + """Return line numbers that are within multiline strings. + + The line numbers are indexed at 1. + + Docstrings are ignored. + + """ + line_numbers = set() + previous_token_type = '' + try: + for t in generate_tokens(source): + token_type = t[0] + start_row = t[2][0] + end_row = t[3][0] + + if token_type == tokenize.STRING and start_row != end_row: + if ( + include_docstrings or + previous_token_type != tokenize.INDENT + ): + # We increment by one since we want the contents of the + # string. + line_numbers |= set(range(1 + start_row, 1 + end_row)) + + previous_token_type = token_type + except (SyntaxError, tokenize.TokenError): + pass + + return line_numbers + + +def commented_out_code_lines(source): + """Return line numbers of comments that are likely code. + + Commented-out code is bad practice, but modifying it just adds even more + clutter. + + """ + line_numbers = [] + try: + for t in generate_tokens(source): + token_type = t[0] + token_string = t[1] + start_row = t[2][0] + line = t[4] + + # Ignore inline comments. + if not line.lstrip().startswith('#'): + continue + + if token_type == tokenize.COMMENT: + stripped_line = token_string.lstrip('#').strip() + if ( + ' ' in stripped_line and + '#' not in stripped_line and + check_syntax(stripped_line) + ): + line_numbers.append(start_row) + except (SyntaxError, tokenize.TokenError): + pass + + return line_numbers + + +def shorten_comment(line, max_line_length, last_comment=False): + """Return trimmed or split long comment line. + + If there are no comments immediately following it, do a text wrap. + Doing this wrapping on all comments in general would lead to jagged + comment text. + + """ + assert len(line) > max_line_length + line = line.rstrip() + + # PEP 8 recommends 72 characters for comment text. + indentation = _get_indentation(line) + '# ' + max_line_length = min(max_line_length, + len(indentation) + 72) + + MIN_CHARACTER_REPEAT = 5 + if ( + len(line) - len(line.rstrip(line[-1])) >= MIN_CHARACTER_REPEAT and + not line[-1].isalnum() + ): + # Trim comments that end with things like --------- + return line[:max_line_length] + '\n' + elif last_comment and re.match(r'\s*#+\s*\w+', line): + import textwrap + split_lines = textwrap.wrap(line.lstrip(' \t#'), + initial_indent=indentation, + subsequent_indent=indentation, + width=max_line_length, + break_long_words=False, + break_on_hyphens=False) + return '\n'.join(split_lines) + '\n' + else: + return line + '\n' + + +def normalize_line_endings(lines, newline): + """Return fixed line endings. + + All lines will be modified to use the most common line ending. + + """ + return [line.rstrip('\n\r') + newline for line in lines] + + +def mutual_startswith(a, b): + return b.startswith(a) or a.startswith(b) + + +def code_match(code, select, ignore): + if ignore: + assert not isinstance(ignore, unicode) + for ignored_code in [c.strip() for c in ignore]: + if mutual_startswith(code.lower(), ignored_code.lower()): + return False + + if select: + assert not isinstance(select, unicode) + for selected_code in [c.strip() for c in select]: + if mutual_startswith(code.lower(), selected_code.lower()): + return True + return False + + return True + + +def fix_code(source, options=None, encoding=None): + """Return fixed source code.""" + if not options: + options = parse_args(['']) + + if not isinstance(source, unicode): + source = source.decode(encoding or locale.getpreferredencoding()) + + sio = io.StringIO(source) + return fix_lines(sio.readlines(), options=options) + + +def fix_lines(source_lines, options, filename=''): + """Return fixed source code.""" + # Transform everything to line feed. Then change them back to original + # before returning fixed source code. + original_newline = find_newline(source_lines) + tmp_source = ''.join(normalize_line_endings(source_lines, '\n')) + + # Keep a history to break out of cycles. + previous_hashes = set() + + if options.line_range: + fixed_source = apply_local_fixes(tmp_source, options) + else: + # Apply global fixes only once (for efficiency). + fixed_source = apply_global_fixes(tmp_source, options) + + passes = 0 + long_line_ignore_cache = set() + while hash(fixed_source) not in previous_hashes: + if options.pep8_passes >= 0 and passes > options.pep8_passes: + break + passes += 1 + + previous_hashes.add(hash(fixed_source)) + + tmp_source = copy.copy(fixed_source) + + fix = FixPEP8( + filename, + options, + contents=tmp_source, + long_line_ignore_cache=long_line_ignore_cache) + + fixed_source = fix.fix() + + sio = io.StringIO(fixed_source) + return ''.join(normalize_line_endings(sio.readlines(), original_newline)) + + +def fix_file(filename, options=None, output=None): + if not options: + options = parse_args([filename]) + + original_source = readlines_from_file(filename) + + fixed_source = original_source + + if options.in_place or output: + encoding = detect_encoding(filename) + + if output: + output = codecs.getwriter(encoding)(output.buffer + if hasattr(output, 'buffer') + else output) + + output = LineEndingWrapper(output) + + fixed_source = fix_lines(fixed_source, options, filename=filename) + + if options.diff: + new = io.StringIO(fixed_source) + new = new.readlines() + diff = get_diff_text(original_source, new, filename) + if output: + output.write(diff) + output.flush() + else: + return diff + elif options.in_place: + fp = open_with_encoding(filename, encoding=encoding, + mode='w') + fp.write(fixed_source) + fp.close() + else: + if output: + output.write(fixed_source) + output.flush() + else: + return fixed_source + + +def global_fixes(): + """Yield multiple (code, function) tuples.""" + for function in globals().values(): + if inspect.isfunction(function): + arguments = inspect.getargspec(function)[0] + if arguments[:1] != ['source']: + continue + + code = extract_code_from_function(function) + if code: + yield (code, function) + + +def apply_global_fixes(source, options, where='global'): + """Run global fixes on source code. + + These are fixes that only need be done once (unlike those in + FixPEP8, which are dependent on pep8). + + """ + if code_match('E101', select=options.select, ignore=options.ignore): + source = reindent(source, + indent_size=options.indent_size) + + for (code, function) in global_fixes(): + if code_match(code, select=options.select, ignore=options.ignore): + if options.verbose: + print('---> Applying {0} fix for {1}'.format(where, + code.upper()), + file=sys.stderr) + source = function(source, + aggressive=options.aggressive) + + source = fix_2to3(source, + aggressive=options.aggressive, + select=options.select, + ignore=options.ignore) + + return source + + +def apply_local_fixes(source, options): + """Ananologus to apply_global_fixes, but runs only those which makes sense + for the given line_range. + + Do as much as we can without breaking code. + + """ + def find_ge(a, x): + """Find leftmost item greater than or equal to x.""" + i = bisect.bisect_left(a, x) + if i != len(a): + return i, a[i] + return len(a) - 1, a[-1] + + def find_le(a, x): + """Find rightmost value less than or equal to x.""" + i = bisect.bisect_right(a, x) + if i: + return i - 1, a[i - 1] + return 0, a[0] + + def local_fix(source, start_log, end_log, + start_lines, end_lines, indents, last_line): + """apply_global_fixes to the source between start_log and end_log. + + The subsource must be the correct syntax of a complete python program + (but all lines may share an indentation). The subsource's shared indent + is removed, fixes are applied and the indent prepended back. Taking + care to not reindent strings. + + last_line is the strict cut off (options.line_range[1]), so that + lines after last_line are not modified. + + """ + if end_log < start_log: + return source + + ind = indents[start_log] + indent = _get_indentation(source[start_lines[start_log]]) + + sl = slice(start_lines[start_log], end_lines[end_log] + 1) + + subsource = source[sl] + # Remove indent from subsource. + if ind: + for line_no in start_lines[start_log:end_log + 1]: + pos = line_no - start_lines[start_log] + subsource[pos] = subsource[pos][ind:] + + # Fix indentation of subsource. + fixed_subsource = apply_global_fixes(''.join(subsource), + options, + where='local') + fixed_subsource = fixed_subsource.splitlines(True) + + # Add back indent for non multi-line strings lines. + msl = multiline_string_lines(''.join(fixed_subsource), + include_docstrings=False) + for i, line in enumerate(fixed_subsource): + if not i + 1 in msl: + fixed_subsource[i] = indent + line if line != '\n' else line + + # We make a special case to look at the final line, if it's a multiline + # *and* the cut off is somewhere inside it, we take the fixed + # subset up until last_line, this assumes that the number of lines + # does not change in this multiline line. + changed_lines = len(fixed_subsource) + if (start_lines[end_log] != end_lines[end_log] + and end_lines[end_log] > last_line): + after_end = end_lines[end_log] - last_line + fixed_subsource = (fixed_subsource[:-after_end] + + source[sl][-after_end:]) + changed_lines -= after_end + + options.line_range[1] = (options.line_range[0] + + changed_lines - 1) + + return (source[:start_lines[start_log]] + + fixed_subsource + + source[end_lines[end_log] + 1:]) + + def is_continued_stmt(line, + continued_stmts=frozenset(['else', 'elif', + 'finally', 'except'])): + return re.split('[ :]', line.strip(), 1)[0] in continued_stmts + + assert options.line_range + start, end = options.line_range + start -= 1 + end -= 1 + last_line = end # We shouldn't modify lines after this cut-off. + + try: + logical = _find_logical(source) + except (SyntaxError, tokenize.TokenError): + return ''.join(source) + + if not logical[0]: + # Just blank lines, this should imply that it will become '\n' ? + return apply_global_fixes(source, options) + + start_lines, indents = zip(*logical[0]) + end_lines, _ = zip(*logical[1]) + + source = source.splitlines(True) + + start_log, start = find_ge(start_lines, start) + end_log, end = find_le(start_lines, end) + + # Look behind one line, if it's indented less than current indent + # then we can move to this previous line knowing that its + # indentation level will not be changed. + if (start_log > 0 + and indents[start_log - 1] < indents[start_log] + and not is_continued_stmt(source[start_log - 1])): + start_log -= 1 + start = start_lines[start_log] + + while start < end: + + if is_continued_stmt(source[start]): + start_log += 1 + start = start_lines[start_log] + continue + + ind = indents[start_log] + for t in itertools.takewhile(lambda t: t[1][1] >= ind, + enumerate(logical[0][start_log:])): + n_log, n = start_log + t[0], t[1][0] + # start shares indent up to n. + + if n <= end: + source = local_fix(source, start_log, n_log, + start_lines, end_lines, + indents, last_line) + start_log = n_log if n == end else n_log + 1 + start = start_lines[start_log] + continue + + else: + # Look at the line after end and see if allows us to reindent. + after_end_log, after_end = find_ge(start_lines, end + 1) + + if indents[after_end_log] > indents[start_log]: + start_log, start = find_ge(start_lines, start + 1) + continue + + if (indents[after_end_log] == indents[start_log] + and is_continued_stmt(source[after_end])): + # find n, the beginning of the last continued statement + # Apply fix to previous block if there is one. + only_block = True + for n, n_ind in logical[0][start_log:end_log + 1][::-1]: + if n_ind == ind and not is_continued_stmt(source[n]): + n_log = start_lines.index(n) + source = local_fix(source, start_log, n_log - 1, + start_lines, end_lines, + indents, last_line) + start_log = n_log + 1 + start = start_lines[start_log] + only_block = False + break + if only_block: + end_log, end = find_le(start_lines, end - 1) + continue + + source = local_fix(source, start_log, end_log, + start_lines, end_lines, + indents, last_line) + break + + return ''.join(source) + + +def extract_code_from_function(function): + """Return code handled by function.""" + if not function.__name__.startswith('fix_'): + return None + + code = re.sub('^fix_', '', function.__name__) + if not code: + return None + + try: + int(code[1:]) + except ValueError: + return None + + return code + + +def create_parser(): + """Return command-line parser.""" + # Do import locally to be friendly to those who use autopep8 as a library + # and are supporting Python 2.6. + import argparse + + parser = argparse.ArgumentParser(description=docstring_summary(__doc__), + prog='autopep8') + parser.add_argument('--version', action='version', + version='%(prog)s ' + __version__) + parser.add_argument('-v', '--verbose', action='count', dest='verbose', + default=0, + help='print verbose messages; ' + 'multiple -v result in more verbose messages') + parser.add_argument('-d', '--diff', action='store_true', dest='diff', + help='print the diff for the fixed source') + parser.add_argument('-i', '--in-place', action='store_true', + help='make changes to files in place') + parser.add_argument('-r', '--recursive', action='store_true', + help='run recursively over directories; ' + 'must be used with --in-place or --diff') + parser.add_argument('-j', '--jobs', type=int, metavar='n', default=1, + help='number of parallel jobs; ' + 'match CPU count if value is less than 1') + parser.add_argument('-p', '--pep8-passes', metavar='n', + default=-1, type=int, + help='maximum number of additional pep8 passes ' + '(default: infinite)') + parser.add_argument('-a', '--aggressive', action='count', default=0, + help='enable non-whitespace changes; ' + 'multiple -a result in more aggressive changes') + parser.add_argument('--experimental', action='store_true', + help='enable experimental fixes') + parser.add_argument('--exclude', metavar='globs', + help='exclude file/directory names that match these ' + 'comma-separated globs') + parser.add_argument('--list-fixes', action='store_true', + help='list codes for fixes; ' + 'used by --ignore and --select') + parser.add_argument('--ignore', metavar='errors', default='', + help='do not fix these errors/warnings ' + '(default: {0})'.format(DEFAULT_IGNORE)) + parser.add_argument('--select', metavar='errors', default='', + help='fix only these errors/warnings (e.g. E4,W)') + parser.add_argument('--max-line-length', metavar='n', default=79, type=int, + help='set maximum allowed line length ' + '(default: %(default)s)') + parser.add_argument('--range', metavar='line', dest='line_range', + default=None, type=int, nargs=2, + help='only fix errors found within this inclusive ' + 'range of line numbers (e.g. 1 99); ' + 'line numbers are indexed at 1') + parser.add_argument('--indent-size', default=DEFAULT_INDENT_SIZE, + type=int, metavar='n', + help='number of spaces per indent level ' + '(default %(default)s)') + parser.add_argument('files', nargs='*', + help="files to format or '-' for standard in") + + return parser + + +def parse_args(arguments): + """Parse command-line options.""" + parser = create_parser() + args = parser.parse_args(arguments) + + if not args.files and not args.list_fixes: + parser.error('incorrect number of arguments') + + args.files = [decode_filename(name) for name in args.files] + + if '-' in args.files: + if len(args.files) > 1: + parser.error('cannot mix stdin and regular files') + + if args.diff: + parser.error('--diff cannot be used with standard input') + + if args.in_place: + parser.error('--in-place cannot be used with standard input') + + if args.recursive: + parser.error('--recursive cannot be used with standard input') + + if len(args.files) > 1 and not (args.in_place or args.diff): + parser.error('autopep8 only takes one filename as argument ' + 'unless the "--in-place" or "--diff" args are ' + 'used') + + if args.recursive and not (args.in_place or args.diff): + parser.error('--recursive must be used with --in-place or --diff') + + if args.exclude and not args.recursive: + parser.error('--exclude is only relevant when used with --recursive') + + if args.in_place and args.diff: + parser.error('--in-place and --diff are mutually exclusive') + + if args.max_line_length <= 0: + parser.error('--max-line-length must be greater than 0') + + if args.select: + args.select = args.select.split(',') + + if args.ignore: + args.ignore = args.ignore.split(',') + elif not args.select: + if args.aggressive: + # Enable everything by default if aggressive. + args.select = ['E', 'W'] + else: + args.ignore = DEFAULT_IGNORE.split(',') + + if args.exclude: + args.exclude = args.exclude.split(',') + else: + args.exclude = [] + + if args.jobs < 1: + # Do not import multiprocessing globally in case it is not supported + # on the platform. + import multiprocessing + args.jobs = multiprocessing.cpu_count() + + if args.jobs > 1 and not args.in_place: + parser.error('parallel jobs requires --in-place') + + if args.line_range: + if args.line_range[0] <= 0: + parser.error('--range must be positive numbers') + if args.line_range[0] > args.line_range[1]: + parser.error('First value of --range should be less than or equal ' + 'to the second') + + return args + + +def decode_filename(filename): + """Return Unicode filename.""" + if isinstance(filename, unicode): + return filename + else: + return filename.decode(sys.getfilesystemencoding()) + + +def supported_fixes(): + """Yield pep8 error codes that autopep8 fixes. + + Each item we yield is a tuple of the code followed by its + description. + + """ + yield ('E101', docstring_summary(reindent.__doc__)) + + instance = FixPEP8(filename=None, options=None, contents='') + for attribute in dir(instance): + code = re.match('fix_([ew][0-9][0-9][0-9])', attribute) + if code: + yield ( + code.group(1).upper(), + re.sub(r'\s+', ' ', + docstring_summary(getattr(instance, attribute).__doc__)) + ) + + for (code, function) in sorted(global_fixes()): + yield (code.upper() + (4 - len(code)) * ' ', + re.sub(r'\s+', ' ', docstring_summary(function.__doc__))) + + for code in sorted(CODE_TO_2TO3): + yield (code.upper() + (4 - len(code)) * ' ', + re.sub(r'\s+', ' ', docstring_summary(fix_2to3.__doc__))) + + +def docstring_summary(docstring): + """Return summary of docstring.""" + return docstring.split('\n')[0] + + +def line_shortening_rank(candidate, indent_word, max_line_length, + experimental=False): + """Return rank of candidate. + + This is for sorting candidates. + + """ + if not candidate.strip(): + return 0 + + rank = 0 + lines = candidate.split('\n') + + offset = 0 + if ( + not lines[0].lstrip().startswith('#') and + lines[0].rstrip()[-1] not in '([{' + ): + for (opening, closing) in ('()', '[]', '{}'): + # Don't penalize empty containers that aren't split up. Things like + # this "foo(\n )" aren't particularly good. + opening_loc = lines[0].find(opening) + closing_loc = lines[0].find(closing) + if opening_loc >= 0: + if closing_loc < 0 or closing_loc != opening_loc + 1: + offset = max(offset, 1 + opening_loc) + + current_longest = max(offset + len(x.strip()) for x in lines) + + rank += 4 * max(0, current_longest - max_line_length) + + rank += len(lines) + + # Too much variation in line length is ugly. + rank += 2 * standard_deviation(len(line) for line in lines) + + bad_staring_symbol = { + '(': ')', + '[': ']', + '{': '}'}.get(lines[0][-1]) + + if len(lines) > 1: + if ( + bad_staring_symbol and + lines[1].lstrip().startswith(bad_staring_symbol) + ): + rank += 20 + + for lineno, current_line in enumerate(lines): + current_line = current_line.strip() + + if current_line.startswith('#'): + continue + + for bad_start in ['.', '%', '+', '-', '/']: + if current_line.startswith(bad_start): + rank += 100 + + # Do not tolerate operators on their own line. + if current_line == bad_start: + rank += 1000 + + if current_line.endswith(('(', '[', '{', '.')): + # Avoid lonely opening. They result in longer lines. + if len(current_line) <= len(indent_word): + rank += 100 + + # Avoid the ugliness of ", (\n". + if ( + current_line.endswith('(') and + current_line[:-1].rstrip().endswith(',') + ): + rank += 100 + + # Also avoid the ugliness of "foo.\nbar" + if current_line.endswith('.'): + rank += 100 + + if has_arithmetic_operator(current_line): + rank += 100 + + if current_line.endswith(('%', '(', '[', '{')): + rank -= 20 + + # Try to break list comprehensions at the "for". + if current_line.startswith('for '): + rank -= 50 + + if current_line.endswith('\\'): + # If a line ends in \-newline, it may be part of a + # multiline string. In that case, we would like to know + # how long that line is without the \-newline. If it's + # longer than the maximum, or has comments, then we assume + # that the \-newline is an okay candidate and only + # penalize it a bit. + total_len = len(current_line) + lineno += 1 + while lineno < len(lines): + total_len += len(lines[lineno]) + + if lines[lineno].lstrip().startswith('#'): + total_len = max_line_length + break + + if not lines[lineno].endswith('\\'): + break + + lineno += 1 + + if total_len < max_line_length: + rank += 10 + else: + rank += 100 if experimental else 1 + + # Prefer breaking at commas rather than colon. + if ',' in current_line and current_line.endswith(':'): + rank += 10 + + rank += 10 * count_unbalanced_brackets(current_line) + + return max(0, rank) + + +def standard_deviation(numbers): + """Return standard devation.""" + numbers = list(numbers) + if not numbers: + return 0 + mean = sum(numbers) / len(numbers) + return (sum((n - mean) ** 2 for n in numbers) / + len(numbers)) ** .5 + + +def has_arithmetic_operator(line): + """Return True if line contains any arithmetic operators.""" + for operator in pep8.ARITHMETIC_OP: + if operator in line: + return True + + return False + + +def count_unbalanced_brackets(line): + """Return number of unmatched open/close brackets.""" + count = 0 + for opening, closing in ['()', '[]', '{}']: + count += abs(line.count(opening) - line.count(closing)) + + return count + + +def split_at_offsets(line, offsets): + """Split line at offsets. + + Return list of strings. + + """ + result = [] + + previous_offset = 0 + current_offset = 0 + for current_offset in sorted(offsets): + if current_offset < len(line) and previous_offset != current_offset: + result.append(line[previous_offset:current_offset].strip()) + previous_offset = current_offset + + result.append(line[current_offset:]) + + return result + + +class LineEndingWrapper(object): + + r"""Replace line endings to work with sys.stdout. + + It seems that sys.stdout expects only '\n' as the line ending, no matter + the platform. Otherwise, we get repeated line endings. + + """ + + def __init__(self, output): + self.__output = output + + def write(self, s): + self.__output.write(s.replace('\r\n', '\n').replace('\r', '\n')) + + def flush(self): + self.__output.flush() + + +def match_file(filename, exclude): + """Return True if file is okay for modifying/recursing.""" + base_name = os.path.basename(filename) + + if base_name.startswith('.'): + return False + + for pattern in exclude: + if fnmatch.fnmatch(base_name, pattern): + return False + + if not os.path.isdir(filename) and not is_python_file(filename): + return False + + return True + + +def find_files(filenames, recursive, exclude): + """Yield filenames.""" + while filenames: + name = filenames.pop(0) + if recursive and os.path.isdir(name): + for root, directories, children in os.walk(name): + filenames += [os.path.join(root, f) for f in children + if match_file(os.path.join(root, f), + exclude)] + directories[:] = [d for d in directories + if match_file(os.path.join(root, d), + exclude)] + else: + yield name + + +def _fix_file(parameters): + """Helper function for optionally running fix_file() in parallel.""" + if parameters[1].verbose: + print('[file:{0}]'.format(parameters[0]), file=sys.stderr) + try: + fix_file(*parameters) + except IOError as error: + print(unicode(error), file=sys.stderr) + + +def fix_multiple_files(filenames, options, output=None): + """Fix list of files. + + Optionally fix files recursively. + + """ + filenames = find_files(filenames, options.recursive, options.exclude) + if options.jobs > 1: + import multiprocessing + pool = multiprocessing.Pool(options.jobs) + pool.map(_fix_file, + [(name, options) for name in filenames]) + else: + for name in filenames: + _fix_file((name, options, output)) + + +def is_python_file(filename): + """Return True if filename is Python file.""" + if filename.endswith('.py'): + return True + + try: + with open_with_encoding(filename) as f: + first_line = f.readlines(1)[0] + except (IOError, IndexError): + return False + + if not PYTHON_SHEBANG_REGEX.match(first_line): + return False + + return True + + +def is_probably_part_of_multiline(line): + """Return True if line is likely part of a multiline string. + + When multiline strings are involved, pep8 reports the error as being + at the start of the multiline string, which doesn't work for us. + + """ + return ( + '"""' in line or + "'''" in line or + line.rstrip().endswith('\\') + ) + + +def main(): + """Tool main.""" + try: + # Exit on broken pipe. + signal.signal(signal.SIGPIPE, signal.SIG_DFL) + except AttributeError: # pragma: no cover + # SIGPIPE is not available on Windows. + pass + + try: + args = parse_args(sys.argv[1:]) + + if args.list_fixes: + for code, description in sorted(supported_fixes()): + print('{code} - {description}'.format( + code=code, description=description)) + return 0 + + if args.files == ['-']: + assert not args.in_place + + # LineEndingWrapper is unnecessary here due to the symmetry between + # standard in and standard out. + + sys.stdout.write( + fix_code( + sys.stdin.read(), + args, + encoding=sys.stdin.encoding)) + else: + if args.in_place or args.diff: + args.files = list(set(args.files)) + else: + assert len(args.files) == 1 + assert not args.recursive + + fix_multiple_files(args.files, args, sys.stdout) + except KeyboardInterrupt: + return 1 # pragma: no cover + + +class CachedTokenizer(object): + + """A one-element cache around tokenize.generate_tokens(). + + Original code written by Ned Batchelder, in coverage.py. + + """ + + def __init__(self): + self.last_text = None + self.last_tokens = None + + def generate_tokens(self, text): + """A stand-in for tokenize.generate_tokens().""" + if text != self.last_text: + string_io = io.StringIO(text) + self.last_tokens = list( + tokenize.generate_tokens(string_io.readline) + ) + self.last_text = text + return self.last_tokens + +_cached_tokenizer = CachedTokenizer() +generate_tokens = _cached_tokenizer.generate_tokens + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/.gitignore b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/.gitignore new file mode 100644 index 000000000000..1c45ce5be3e2 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/.gitignore @@ -0,0 +1 @@ +*.pickle diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/Grammar.txt b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/Grammar.txt new file mode 100644 index 000000000000..1e1f24cfbc76 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/Grammar.txt @@ -0,0 +1,158 @@ +# Grammar for 2to3. This grammar supports Python 2.x and 3.x. + +# Note: Changing the grammar specified in this file will most likely +# require corresponding changes in the parser module +# (../Modules/parsermodule.c). If you can't make the changes to +# that module yourself, please co-ordinate the required changes +# with someone who can; ask around on python-dev for help. Fred +# Drake will probably be listening there. + +# NOTE WELL: You should also follow all the steps listed in PEP 306, +# "How to Change Python's Grammar" + +# Commands for Kees Blom's railroad program +#diagram:token NAME +#diagram:token NUMBER +#diagram:token STRING +#diagram:token NEWLINE +#diagram:token ENDMARKER +#diagram:token INDENT +#diagram:output\input python.bla +#diagram:token DEDENT +#diagram:output\textwidth 20.04cm\oddsidemargin 0.0cm\evensidemargin 0.0cm +#diagram:rules + +# Start symbols for the grammar: +# file_input is a module or sequence of commands read from an input file; +# single_input is a single interactive statement; +# eval_input is the input for the eval() and input() functions. +# NB: compound_stmt in single_input is followed by extra NEWLINE! +file_input: (NEWLINE | stmt)* ENDMARKER +single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE +eval_input: testlist NEWLINE* ENDMARKER + +decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE +decorators: decorator+ +decorated: decorators (classdef | funcdef) +funcdef: 'def' NAME parameters ['->' test] ':' suite +parameters: '(' [typedargslist] ')' +typedargslist: ((tfpdef ['=' test] ',')* + ('*' [tname] (',' tname ['=' test])* [',' '**' tname] | '**' tname) + | tfpdef ['=' test] (',' tfpdef ['=' test])* [',']) +tname: NAME [':' test] +tfpdef: tname | '(' tfplist ')' +tfplist: tfpdef (',' tfpdef)* [','] +varargslist: ((vfpdef ['=' test] ',')* + ('*' [vname] (',' vname ['=' test])* [',' '**' vname] | '**' vname) + | vfpdef ['=' test] (',' vfpdef ['=' test])* [',']) +vname: NAME +vfpdef: vname | '(' vfplist ')' +vfplist: vfpdef (',' vfpdef)* [','] + +stmt: simple_stmt | compound_stmt +simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE +small_stmt: (expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt | + import_stmt | global_stmt | exec_stmt | assert_stmt) +expr_stmt: testlist_star_expr (augassign (yield_expr|testlist) | + ('=' (yield_expr|testlist_star_expr))*) +testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [','] +augassign: ('+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | + '<<=' | '>>=' | '**=' | '//=') +# For normal assignments, additional restrictions enforced by the interpreter +print_stmt: 'print' ( [ test (',' test)* [','] ] | + '>>' test [ (',' test)+ [','] ] ) +del_stmt: 'del' exprlist +pass_stmt: 'pass' +flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt +break_stmt: 'break' +continue_stmt: 'continue' +return_stmt: 'return' [testlist] +yield_stmt: yield_expr +raise_stmt: 'raise' [test ['from' test | ',' test [',' test]]] +import_stmt: import_name | import_from +import_name: 'import' dotted_as_names +import_from: ('from' ('.'* dotted_name | '.'+) + 'import' ('*' | '(' import_as_names ')' | import_as_names)) +import_as_name: NAME ['as' NAME] +dotted_as_name: dotted_name ['as' NAME] +import_as_names: import_as_name (',' import_as_name)* [','] +dotted_as_names: dotted_as_name (',' dotted_as_name)* +dotted_name: NAME ('.' NAME)* +global_stmt: ('global' | 'nonlocal') NAME (',' NAME)* +exec_stmt: 'exec' expr ['in' test [',' test]] +assert_stmt: 'assert' test [',' test] + +compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated +if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] +while_stmt: 'while' test ':' suite ['else' ':' suite] +for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] +try_stmt: ('try' ':' suite + ((except_clause ':' suite)+ + ['else' ':' suite] + ['finally' ':' suite] | + 'finally' ':' suite)) +with_stmt: 'with' with_item (',' with_item)* ':' suite +with_item: test ['as' expr] +with_var: 'as' expr +# NB compile.c makes sure that the default except clause is last +except_clause: 'except' [test [(',' | 'as') test]] +suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT + +# Backward compatibility cruft to support: +# [ x for x in lambda: True, lambda: False if x() ] +# even while also allowing: +# lambda x: 5 if x else 2 +# (But not a mix of the two) +testlist_safe: old_test [(',' old_test)+ [',']] +old_test: or_test | old_lambdef +old_lambdef: 'lambda' [varargslist] ':' old_test + +test: or_test ['if' or_test 'else' test] | lambdef +or_test: and_test ('or' and_test)* +and_test: not_test ('and' not_test)* +not_test: 'not' not_test | comparison +comparison: expr (comp_op expr)* +comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not' +star_expr: '*' expr +expr: xor_expr ('|' xor_expr)* +xor_expr: and_expr ('^' and_expr)* +and_expr: shift_expr ('&' shift_expr)* +shift_expr: arith_expr (('<<'|'>>') arith_expr)* +arith_expr: term (('+'|'-') term)* +term: factor (('*'|'/'|'%'|'//') factor)* +factor: ('+'|'-'|'~') factor | power +power: atom trailer* ['**' factor] +atom: ('(' [yield_expr|testlist_gexp] ')' | + '[' [listmaker] ']' | + '{' [dictsetmaker] '}' | + '`' testlist1 '`' | + NAME | NUMBER | STRING+ | '.' '.' '.') +listmaker: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] ) +testlist_gexp: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] ) +lambdef: 'lambda' [varargslist] ':' test +trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME +subscriptlist: subscript (',' subscript)* [','] +subscript: test | [test] ':' [test] [sliceop] +sliceop: ':' [test] +exprlist: (expr|star_expr) (',' (expr|star_expr))* [','] +testlist: test (',' test)* [','] +dictsetmaker: ( (test ':' test (comp_for | (',' test ':' test)* [','])) | + (test (comp_for | (',' test)* [','])) ) + +classdef: 'class' NAME ['(' [arglist] ')'] ':' suite + +arglist: (argument ',')* (argument [','] + |'*' test (',' argument)* [',' '**' test] + |'**' test) +argument: test [comp_for] | test '=' test # Really [keyword '='] test + +comp_iter: comp_for | comp_if +comp_for: 'for' exprlist 'in' testlist_safe [comp_iter] +comp_if: 'if' old_test [comp_iter] + +testlist1: test (',' test)* + +# not used in grammar, but may appear in "node" passed from Parser to Compiler +encoding_decl: NAME + +yield_expr: 'yield' [testlist] diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/PatternGrammar.txt b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/PatternGrammar.txt new file mode 100644 index 000000000000..36bf8148273b --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/PatternGrammar.txt @@ -0,0 +1,28 @@ +# Copyright 2006 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +# A grammar to describe tree matching patterns. +# Not shown here: +# - 'TOKEN' stands for any token (leaf node) +# - 'any' stands for any node (leaf or interior) +# With 'any' we can still specify the sub-structure. + +# The start symbol is 'Matcher'. + +Matcher: Alternatives ENDMARKER + +Alternatives: Alternative ('|' Alternative)* + +Alternative: (Unit | NegatedUnit)+ + +Unit: [NAME '='] ( STRING [Repeater] + | NAME [Details] [Repeater] + | '(' Alternatives ')' [Repeater] + | '[' Alternatives ']' + ) + +NegatedUnit: 'not' (STRING | NAME [Details] | '(' Alternatives ')') + +Repeater: '*' | '+' | '{' NUMBER [',' NUMBER] '}' + +Details: '<' Alternatives '>' diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/__init__.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/__init__.py new file mode 100644 index 000000000000..ea30561d8397 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/__init__.py @@ -0,0 +1 @@ +#empty diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/__main__.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/__main__.py new file mode 100644 index 000000000000..80688baf27ab --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/__main__.py @@ -0,0 +1,4 @@ +import sys +from .main import main + +sys.exit(main("lib2to3.fixes")) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/btm_matcher.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/btm_matcher.py new file mode 100644 index 000000000000..736ba2b9d83a --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/btm_matcher.py @@ -0,0 +1,168 @@ +"""A bottom-up tree matching algorithm implementation meant to speed +up 2to3's matching process. After the tree patterns are reduced to +their rarest linear path, a linear Aho-Corasick automaton is +created. The linear automaton traverses the linear paths from the +leaves to the root of the AST and returns a set of nodes for further +matching. This reduces significantly the number of candidate nodes.""" + +__author__ = "George Boutsioukis " + +import logging +import itertools +from collections import defaultdict + +from . import pytree +from .btm_utils import reduce_tree + +class BMNode(object): + """Class for a node of the Aho-Corasick automaton used in matching""" + count = itertools.count() + def __init__(self): + self.transition_table = {} + self.fixers = [] + self.id = next(BMNode.count) + self.content = '' + +class BottomMatcher(object): + """The main matcher class. After instantiating the patterns should + be added using the add_fixer method""" + + def __init__(self): + self.match = set() + self.root = BMNode() + self.nodes = [self.root] + self.fixers = [] + self.logger = logging.getLogger("RefactoringTool") + + def add_fixer(self, fixer): + """Reduces a fixer's pattern tree to a linear path and adds it + to the matcher(a common Aho-Corasick automaton). The fixer is + appended on the matching states and called when they are + reached""" + self.fixers.append(fixer) + tree = reduce_tree(fixer.pattern_tree) + linear = tree.get_linear_subpattern() + match_nodes = self.add(linear, start=self.root) + for match_node in match_nodes: + match_node.fixers.append(fixer) + + def add(self, pattern, start): + "Recursively adds a linear pattern to the AC automaton" + #print("adding pattern", pattern, "to", start) + if not pattern: + #print("empty pattern") + return [start] + if isinstance(pattern[0], tuple): + #alternatives + #print("alternatives") + match_nodes = [] + for alternative in pattern[0]: + #add all alternatives, and add the rest of the pattern + #to each end node + end_nodes = self.add(alternative, start=start) + for end in end_nodes: + match_nodes.extend(self.add(pattern[1:], end)) + return match_nodes + else: + #single token + #not last + if pattern[0] not in start.transition_table: + #transition did not exist, create new + next_node = BMNode() + start.transition_table[pattern[0]] = next_node + else: + #transition exists already, follow + next_node = start.transition_table[pattern[0]] + + if pattern[1:]: + end_nodes = self.add(pattern[1:], start=next_node) + else: + end_nodes = [next_node] + return end_nodes + + def run(self, leaves): + """The main interface with the bottom matcher. The tree is + traversed from the bottom using the constructed + automaton. Nodes are only checked once as the tree is + retraversed. When the automaton fails, we give it one more + shot(in case the above tree matches as a whole with the + rejected leaf), then we break for the next leaf. There is the + special case of multiple arguments(see code comments) where we + recheck the nodes + + Args: + The leaves of the AST tree to be matched + + Returns: + A dictionary of node matches with fixers as the keys + """ + current_ac_node = self.root + results = defaultdict(list) + for leaf in leaves: + current_ast_node = leaf + while current_ast_node: + current_ast_node.was_checked = True + for child in current_ast_node.children: + # multiple statements, recheck + if isinstance(child, pytree.Leaf) and child.value == u";": + current_ast_node.was_checked = False + break + if current_ast_node.type == 1: + #name + node_token = current_ast_node.value + else: + node_token = current_ast_node.type + + if node_token in current_ac_node.transition_table: + #token matches + current_ac_node = current_ac_node.transition_table[node_token] + for fixer in current_ac_node.fixers: + if not fixer in results: + results[fixer] = [] + results[fixer].append(current_ast_node) + + else: + #matching failed, reset automaton + current_ac_node = self.root + if (current_ast_node.parent is not None + and current_ast_node.parent.was_checked): + #the rest of the tree upwards has been checked, next leaf + break + + #recheck the rejected node once from the root + if node_token in current_ac_node.transition_table: + #token matches + current_ac_node = current_ac_node.transition_table[node_token] + for fixer in current_ac_node.fixers: + if not fixer in results.keys(): + results[fixer] = [] + results[fixer].append(current_ast_node) + + current_ast_node = current_ast_node.parent + return results + + def print_ac(self): + "Prints a graphviz diagram of the BM automaton(for debugging)" + print("digraph g{") + def print_node(node): + for subnode_key in node.transition_table.keys(): + subnode = node.transition_table[subnode_key] + print("%d -> %d [label=%s] //%s" % + (node.id, subnode.id, type_repr(subnode_key), str(subnode.fixers))) + if subnode_key == 1: + print(subnode.content) + print_node(subnode) + print_node(self.root) + print("}") + +# taken from pytree.py for debugging; only used by print_ac +_type_reprs = {} +def type_repr(type_num): + global _type_reprs + if not _type_reprs: + from .pygram import python_symbols + # printing tokens is possible but not as useful + # from .pgen2 import token // token.__dict__.items(): + for name, val in python_symbols.__dict__.items(): + if type(val) == int: _type_reprs[val] = name + return _type_reprs.setdefault(type_num, type_num) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/btm_utils.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/btm_utils.py new file mode 100644 index 000000000000..2276dc9e966d --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/btm_utils.py @@ -0,0 +1,283 @@ +"Utility functions used by the btm_matcher module" + +from . import pytree +from .pgen2 import grammar, token +from .pygram import pattern_symbols, python_symbols + +syms = pattern_symbols +pysyms = python_symbols +tokens = grammar.opmap +token_labels = token + +TYPE_ANY = -1 +TYPE_ALTERNATIVES = -2 +TYPE_GROUP = -3 + +class MinNode(object): + """This class serves as an intermediate representation of the + pattern tree during the conversion to sets of leaf-to-root + subpatterns""" + + def __init__(self, type=None, name=None): + self.type = type + self.name = name + self.children = [] + self.leaf = False + self.parent = None + self.alternatives = [] + self.group = [] + + def __repr__(self): + return str(self.type) + ' ' + str(self.name) + + def leaf_to_root(self): + """Internal method. Returns a characteristic path of the + pattern tree. This method must be run for all leaves until the + linear subpatterns are merged into a single""" + node = self + subp = [] + while node: + if node.type == TYPE_ALTERNATIVES: + node.alternatives.append(subp) + if len(node.alternatives) == len(node.children): + #last alternative + subp = [tuple(node.alternatives)] + node.alternatives = [] + node = node.parent + continue + else: + node = node.parent + subp = None + break + + if node.type == TYPE_GROUP: + node.group.append(subp) + #probably should check the number of leaves + if len(node.group) == len(node.children): + subp = get_characteristic_subpattern(node.group) + node.group = [] + node = node.parent + continue + else: + node = node.parent + subp = None + break + + if node.type == token_labels.NAME and node.name: + #in case of type=name, use the name instead + subp.append(node.name) + else: + subp.append(node.type) + + node = node.parent + return subp + + def get_linear_subpattern(self): + """Drives the leaf_to_root method. The reason that + leaf_to_root must be run multiple times is because we need to + reject 'group' matches; for example the alternative form + (a | b c) creates a group [b c] that needs to be matched. Since + matching multiple linear patterns overcomes the automaton's + capabilities, leaf_to_root merges each group into a single + choice based on 'characteristic'ity, + + i.e. (a|b c) -> (a|b) if b more characteristic than c + + Returns: The most 'characteristic'(as defined by + get_characteristic_subpattern) path for the compiled pattern + tree. + """ + + for l in self.leaves(): + subp = l.leaf_to_root() + if subp: + return subp + + def leaves(self): + "Generator that returns the leaves of the tree" + for child in self.children: + for x in child.leaves(): + yield x + if not self.children: + yield self + +def reduce_tree(node, parent=None): + """ + Internal function. Reduces a compiled pattern tree to an + intermediate representation suitable for feeding the + automaton. This also trims off any optional pattern elements(like + [a], a*). + """ + + new_node = None + #switch on the node type + if node.type == syms.Matcher: + #skip + node = node.children[0] + + if node.type == syms.Alternatives : + #2 cases + if len(node.children) <= 2: + #just a single 'Alternative', skip this node + new_node = reduce_tree(node.children[0], parent) + else: + #real alternatives + new_node = MinNode(type=TYPE_ALTERNATIVES) + #skip odd children('|' tokens) + for child in node.children: + if node.children.index(child)%2: + continue + reduced = reduce_tree(child, new_node) + if reduced is not None: + new_node.children.append(reduced) + elif node.type == syms.Alternative: + if len(node.children) > 1: + + new_node = MinNode(type=TYPE_GROUP) + for child in node.children: + reduced = reduce_tree(child, new_node) + if reduced: + new_node.children.append(reduced) + if not new_node.children: + # delete the group if all of the children were reduced to None + new_node = None + + else: + new_node = reduce_tree(node.children[0], parent) + + elif node.type == syms.Unit: + if (isinstance(node.children[0], pytree.Leaf) and + node.children[0].value == '('): + #skip parentheses + return reduce_tree(node.children[1], parent) + if ((isinstance(node.children[0], pytree.Leaf) and + node.children[0].value == '[') + or + (len(node.children)>1 and + hasattr(node.children[1], "value") and + node.children[1].value == '[')): + #skip whole unit if its optional + return None + + leaf = True + details_node = None + alternatives_node = None + has_repeater = False + repeater_node = None + has_variable_name = False + + for child in node.children: + if child.type == syms.Details: + leaf = False + details_node = child + elif child.type == syms.Repeater: + has_repeater = True + repeater_node = child + elif child.type == syms.Alternatives: + alternatives_node = child + if hasattr(child, 'value') and child.value == '=': # variable name + has_variable_name = True + + #skip variable name + if has_variable_name: + #skip variable name, '=' + name_leaf = node.children[2] + if hasattr(name_leaf, 'value') and name_leaf.value == '(': + # skip parenthesis + name_leaf = node.children[3] + else: + name_leaf = node.children[0] + + #set node type + if name_leaf.type == token_labels.NAME: + #(python) non-name or wildcard + if name_leaf.value == 'any': + new_node = MinNode(type=TYPE_ANY) + else: + if hasattr(token_labels, name_leaf.value): + new_node = MinNode(type=getattr(token_labels, name_leaf.value)) + else: + new_node = MinNode(type=getattr(pysyms, name_leaf.value)) + + elif name_leaf.type == token_labels.STRING: + #(python) name or character; remove the apostrophes from + #the string value + name = name_leaf.value.strip("'") + if name in tokens: + new_node = MinNode(type=tokens[name]) + else: + new_node = MinNode(type=token_labels.NAME, name=name) + elif name_leaf.type == syms.Alternatives: + new_node = reduce_tree(alternatives_node, parent) + + #handle repeaters + if has_repeater: + if repeater_node.children[0].value == '*': + #reduce to None + new_node = None + elif repeater_node.children[0].value == '+': + #reduce to a single occurence i.e. do nothing + pass + else: + #TODO: handle {min, max} repeaters + raise NotImplementedError + pass + + #add children + if details_node and new_node is not None: + for child in details_node.children[1:-1]: + #skip '<', '>' markers + reduced = reduce_tree(child, new_node) + if reduced is not None: + new_node.children.append(reduced) + if new_node: + new_node.parent = parent + return new_node + + +def get_characteristic_subpattern(subpatterns): + """Picks the most characteristic from a list of linear patterns + Current order used is: + names > common_names > common_chars + """ + if not isinstance(subpatterns, list): + return subpatterns + if len(subpatterns)==1: + return subpatterns[0] + + # first pick out the ones containing variable names + subpatterns_with_names = [] + subpatterns_with_common_names = [] + common_names = ['in', 'for', 'if' , 'not', 'None'] + subpatterns_with_common_chars = [] + common_chars = "[]().,:" + for subpattern in subpatterns: + if any(rec_test(subpattern, lambda x: type(x) is str)): + if any(rec_test(subpattern, + lambda x: isinstance(x, str) and x in common_chars)): + subpatterns_with_common_chars.append(subpattern) + elif any(rec_test(subpattern, + lambda x: isinstance(x, str) and x in common_names)): + subpatterns_with_common_names.append(subpattern) + + else: + subpatterns_with_names.append(subpattern) + + if subpatterns_with_names: + subpatterns = subpatterns_with_names + elif subpatterns_with_common_names: + subpatterns = subpatterns_with_common_names + elif subpatterns_with_common_chars: + subpatterns = subpatterns_with_common_chars + # of the remaining subpatterns pick out the longest one + return max(subpatterns, key=len) + +def rec_test(sequence, test_func): + """Tests test_func on all items of sequence and items of included + sub-iterables""" + for x in sequence: + if isinstance(x, (list, tuple)): + for y in rec_test(x, test_func): + yield y + else: + yield test_func(x) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixer_base.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixer_base.py new file mode 100644 index 000000000000..f6421ba3f74f --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixer_base.py @@ -0,0 +1,189 @@ +# Copyright 2006 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Base class for fixers (optional, but recommended).""" + +# Python imports +import logging +import itertools + +# Local imports +from .patcomp import PatternCompiler +from . import pygram +from .fixer_util import does_tree_import + +class BaseFix(object): + + """Optional base class for fixers. + + The subclass name must be FixFooBar where FooBar is the result of + removing underscores and capitalizing the words of the fix name. + For example, the class name for a fixer named 'has_key' should be + FixHasKey. + """ + + PATTERN = None # Most subclasses should override with a string literal + pattern = None # Compiled pattern, set by compile_pattern() + pattern_tree = None # Tree representation of the pattern + options = None # Options object passed to initializer + filename = None # The filename (set by set_filename) + logger = None # A logger (set by set_filename) + numbers = itertools.count(1) # For new_name() + used_names = set() # A set of all used NAMEs + order = "post" # Does the fixer prefer pre- or post-order traversal + explicit = False # Is this ignored by refactor.py -f all? + run_order = 5 # Fixers will be sorted by run order before execution + # Lower numbers will be run first. + _accept_type = None # [Advanced and not public] This tells RefactoringTool + # which node type to accept when there's not a pattern. + + keep_line_order = False # For the bottom matcher: match with the + # original line order + BM_compatible = False # Compatibility with the bottom matching + # module; every fixer should set this + # manually + + # Shortcut for access to Python grammar symbols + syms = pygram.python_symbols + + def __init__(self, options, log): + """Initializer. Subclass may override. + + Args: + options: an dict containing the options passed to RefactoringTool + that could be used to customize the fixer through the command line. + log: a list to append warnings and other messages to. + """ + self.options = options + self.log = log + self.compile_pattern() + + def compile_pattern(self): + """Compiles self.PATTERN into self.pattern. + + Subclass may override if it doesn't want to use + self.{pattern,PATTERN} in .match(). + """ + if self.PATTERN is not None: + PC = PatternCompiler() + self.pattern, self.pattern_tree = PC.compile_pattern(self.PATTERN, + with_tree=True) + + def set_filename(self, filename): + """Set the filename, and a logger derived from it. + + The main refactoring tool should call this. + """ + self.filename = filename + self.logger = logging.getLogger(filename) + + def match(self, node): + """Returns match for a given parse tree node. + + Should return a true or false object (not necessarily a bool). + It may return a non-empty dict of matching sub-nodes as + returned by a matching pattern. + + Subclass may override. + """ + results = {"node": node} + return self.pattern.match(node, results) and results + + def transform(self, node, results): + """Returns the transformation for a given parse tree node. + + Args: + node: the root of the parse tree that matched the fixer. + results: a dict mapping symbolic names to part of the match. + + Returns: + None, or a node that is a modified copy of the + argument node. The node argument may also be modified in-place to + effect the same change. + + Subclass *must* override. + """ + raise NotImplementedError() + + def new_name(self, template=u"xxx_todo_changeme"): + """Return a string suitable for use as an identifier + + The new name is guaranteed not to conflict with other identifiers. + """ + name = template + while name in self.used_names: + name = template + unicode(self.numbers.next()) + self.used_names.add(name) + return name + + def log_message(self, message): + if self.first_log: + self.first_log = False + self.log.append("### In file %s ###" % self.filename) + self.log.append(message) + + def cannot_convert(self, node, reason=None): + """Warn the user that a given chunk of code is not valid Python 3, + but that it cannot be converted automatically. + + First argument is the top-level node for the code in question. + Optional second argument is why it can't be converted. + """ + lineno = node.get_lineno() + for_output = node.clone() + for_output.prefix = u"" + msg = "Line %d: could not convert: %s" + self.log_message(msg % (lineno, for_output)) + if reason: + self.log_message(reason) + + def warning(self, node, reason): + """Used for warning the user about possible uncertainty in the + translation. + + First argument is the top-level node for the code in question. + Optional second argument is why it can't be converted. + """ + lineno = node.get_lineno() + self.log_message("Line %d: %s" % (lineno, reason)) + + def start_tree(self, tree, filename): + """Some fixers need to maintain tree-wide state. + This method is called once, at the start of tree fix-up. + + tree - the root node of the tree to be processed. + filename - the name of the file the tree came from. + """ + self.used_names = tree.used_names + self.set_filename(filename) + self.numbers = itertools.count(1) + self.first_log = True + + def finish_tree(self, tree, filename): + """Some fixers need to maintain tree-wide state. + This method is called once, at the conclusion of tree fix-up. + + tree - the root node of the tree to be processed. + filename - the name of the file the tree came from. + """ + pass + + +class ConditionalFix(BaseFix): + """ Base class for fixers which not execute if an import is found. """ + + # This is the name of the import which, if found, will cause the test to be skipped + skip_on = None + + def start_tree(self, *args): + super(ConditionalFix, self).start_tree(*args) + self._should_skip = None + + def should_skip(self, node): + if self._should_skip is not None: + return self._should_skip + pkg = self.skip_on.split(".") + name = pkg[-1] + pkg = ".".join(pkg[:-1]) + self._should_skip = does_tree_import(pkg, name, node) + return self._should_skip diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixer_util.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixer_util.py new file mode 100644 index 000000000000..79c5d6aadc8c --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixer_util.py @@ -0,0 +1,430 @@ +"""Utility functions, node construction macros, etc.""" +# Author: Collin Winter + +# Local imports +from .pgen2 import token +from .pytree import Leaf, Node +from .pygram import python_symbols as syms +from . import patcomp + + +########################################################### +### Common node-construction "macros" +########################################################### + +def KeywordArg(keyword, value): + return Node(syms.argument, + [keyword, Leaf(token.EQUAL, u"="), value]) + +def LParen(): + return Leaf(token.LPAR, u"(") + +def RParen(): + return Leaf(token.RPAR, u")") + +def Assign(target, source): + """Build an assignment statement""" + if not isinstance(target, list): + target = [target] + if not isinstance(source, list): + source.prefix = u" " + source = [source] + + return Node(syms.atom, + target + [Leaf(token.EQUAL, u"=", prefix=u" ")] + source) + +def Name(name, prefix=None): + """Return a NAME leaf""" + return Leaf(token.NAME, name, prefix=prefix) + +def Attr(obj, attr): + """A node tuple for obj.attr""" + return [obj, Node(syms.trailer, [Dot(), attr])] + +def Comma(): + """A comma leaf""" + return Leaf(token.COMMA, u",") + +def Dot(): + """A period (.) leaf""" + return Leaf(token.DOT, u".") + +def ArgList(args, lparen=LParen(), rparen=RParen()): + """A parenthesised argument list, used by Call()""" + node = Node(syms.trailer, [lparen.clone(), rparen.clone()]) + if args: + node.insert_child(1, Node(syms.arglist, args)) + return node + +def Call(func_name, args=None, prefix=None): + """A function call""" + node = Node(syms.power, [func_name, ArgList(args)]) + if prefix is not None: + node.prefix = prefix + return node + +def Newline(): + """A newline literal""" + return Leaf(token.NEWLINE, u"\n") + +def BlankLine(): + """A blank line""" + return Leaf(token.NEWLINE, u"") + +def Number(n, prefix=None): + return Leaf(token.NUMBER, n, prefix=prefix) + +def Subscript(index_node): + """A numeric or string subscript""" + return Node(syms.trailer, [Leaf(token.LBRACE, u"["), + index_node, + Leaf(token.RBRACE, u"]")]) + +def String(string, prefix=None): + """A string leaf""" + return Leaf(token.STRING, string, prefix=prefix) + +def ListComp(xp, fp, it, test=None): + """A list comprehension of the form [xp for fp in it if test]. + + If test is None, the "if test" part is omitted. + """ + xp.prefix = u"" + fp.prefix = u" " + it.prefix = u" " + for_leaf = Leaf(token.NAME, u"for") + for_leaf.prefix = u" " + in_leaf = Leaf(token.NAME, u"in") + in_leaf.prefix = u" " + inner_args = [for_leaf, fp, in_leaf, it] + if test: + test.prefix = u" " + if_leaf = Leaf(token.NAME, u"if") + if_leaf.prefix = u" " + inner_args.append(Node(syms.comp_if, [if_leaf, test])) + inner = Node(syms.listmaker, [xp, Node(syms.comp_for, inner_args)]) + return Node(syms.atom, + [Leaf(token.LBRACE, u"["), + inner, + Leaf(token.RBRACE, u"]")]) + +def FromImport(package_name, name_leafs): + """ Return an import statement in the form: + from package import name_leafs""" + # XXX: May not handle dotted imports properly (eg, package_name='foo.bar') + #assert package_name == '.' or '.' not in package_name, "FromImport has "\ + # "not been tested with dotted package names -- use at your own "\ + # "peril!" + + for leaf in name_leafs: + # Pull the leaves out of their old tree + leaf.remove() + + children = [Leaf(token.NAME, u"from"), + Leaf(token.NAME, package_name, prefix=u" "), + Leaf(token.NAME, u"import", prefix=u" "), + Node(syms.import_as_names, name_leafs)] + imp = Node(syms.import_from, children) + return imp + + +########################################################### +### Determine whether a node represents a given literal +########################################################### + +def is_tuple(node): + """Does the node represent a tuple literal?""" + if isinstance(node, Node) and node.children == [LParen(), RParen()]: + return True + return (isinstance(node, Node) + and len(node.children) == 3 + and isinstance(node.children[0], Leaf) + and isinstance(node.children[1], Node) + and isinstance(node.children[2], Leaf) + and node.children[0].value == u"(" + and node.children[2].value == u")") + +def is_list(node): + """Does the node represent a list literal?""" + return (isinstance(node, Node) + and len(node.children) > 1 + and isinstance(node.children[0], Leaf) + and isinstance(node.children[-1], Leaf) + and node.children[0].value == u"[" + and node.children[-1].value == u"]") + + +########################################################### +### Misc +########################################################### + +def parenthesize(node): + return Node(syms.atom, [LParen(), node, RParen()]) + + +consuming_calls = set(["sorted", "list", "set", "any", "all", "tuple", "sum", + "min", "max", "enumerate"]) + +def attr_chain(obj, attr): + """Follow an attribute chain. + + If you have a chain of objects where a.foo -> b, b.foo-> c, etc, + use this to iterate over all objects in the chain. Iteration is + terminated by getattr(x, attr) is None. + + Args: + obj: the starting object + attr: the name of the chaining attribute + + Yields: + Each successive object in the chain. + """ + next = getattr(obj, attr) + while next: + yield next + next = getattr(next, attr) + +p0 = """for_stmt< 'for' any 'in' node=any ':' any* > + | comp_for< 'for' any 'in' node=any any* > + """ +p1 = """ +power< + ( 'iter' | 'list' | 'tuple' | 'sorted' | 'set' | 'sum' | + 'any' | 'all' | 'enumerate' | (any* trailer< '.' 'join' >) ) + trailer< '(' node=any ')' > + any* +> +""" +p2 = """ +power< + ( 'sorted' | 'enumerate' ) + trailer< '(' arglist ')' > + any* +> +""" +pats_built = False +def in_special_context(node): + """ Returns true if node is in an environment where all that is required + of it is being iterable (ie, it doesn't matter if it returns a list + or an iterator). + See test_map_nochange in test_fixers.py for some examples and tests. + """ + global p0, p1, p2, pats_built + if not pats_built: + p0 = patcomp.compile_pattern(p0) + p1 = patcomp.compile_pattern(p1) + p2 = patcomp.compile_pattern(p2) + pats_built = True + patterns = [p0, p1, p2] + for pattern, parent in zip(patterns, attr_chain(node, "parent")): + results = {} + if pattern.match(parent, results) and results["node"] is node: + return True + return False + +def is_probably_builtin(node): + """ + Check that something isn't an attribute or function name etc. + """ + prev = node.prev_sibling + if prev is not None and prev.type == token.DOT: + # Attribute lookup. + return False + parent = node.parent + if parent.type in (syms.funcdef, syms.classdef): + return False + if parent.type == syms.expr_stmt and parent.children[0] is node: + # Assignment. + return False + if parent.type == syms.parameters or \ + (parent.type == syms.typedargslist and ( + (prev is not None and prev.type == token.COMMA) or + parent.children[0] is node + )): + # The name of an argument. + return False + return True + +def find_indentation(node): + """Find the indentation of *node*.""" + while node is not None: + if node.type == syms.suite and len(node.children) > 2: + indent = node.children[1] + if indent.type == token.INDENT: + return indent.value + node = node.parent + return u"" + +########################################################### +### The following functions are to find bindings in a suite +########################################################### + +def make_suite(node): + if node.type == syms.suite: + return node + node = node.clone() + parent, node.parent = node.parent, None + suite = Node(syms.suite, [node]) + suite.parent = parent + return suite + +def find_root(node): + """Find the top level namespace.""" + # Scamper up to the top level namespace + while node.type != syms.file_input: + node = node.parent + if not node: + raise ValueError("root found before file_input node was found.") + return node + +def does_tree_import(package, name, node): + """ Returns true if name is imported from package at the + top level of the tree which node belongs to. + To cover the case of an import like 'import foo', use + None for the package and 'foo' for the name. """ + binding = find_binding(name, find_root(node), package) + return bool(binding) + +def is_import(node): + """Returns true if the node is an import statement.""" + return node.type in (syms.import_name, syms.import_from) + +def touch_import(package, name, node): + """ Works like `does_tree_import` but adds an import statement + if it was not imported. """ + def is_import_stmt(node): + return (node.type == syms.simple_stmt and node.children and + is_import(node.children[0])) + + root = find_root(node) + + if does_tree_import(package, name, root): + return + + # figure out where to insert the new import. First try to find + # the first import and then skip to the last one. + insert_pos = offset = 0 + for idx, node in enumerate(root.children): + if not is_import_stmt(node): + continue + for offset, node2 in enumerate(root.children[idx:]): + if not is_import_stmt(node2): + break + insert_pos = idx + offset + break + + # if there are no imports where we can insert, find the docstring. + # if that also fails, we stick to the beginning of the file + if insert_pos == 0: + for idx, node in enumerate(root.children): + if (node.type == syms.simple_stmt and node.children and + node.children[0].type == token.STRING): + insert_pos = idx + 1 + break + + if package is None: + import_ = Node(syms.import_name, [ + Leaf(token.NAME, u"import"), + Leaf(token.NAME, name, prefix=u" ") + ]) + else: + import_ = FromImport(package, [Leaf(token.NAME, name, prefix=u" ")]) + + children = [import_, Newline()] + root.insert_child(insert_pos, Node(syms.simple_stmt, children)) + + +_def_syms = set([syms.classdef, syms.funcdef]) +def find_binding(name, node, package=None): + """ Returns the node which binds variable name, otherwise None. + If optional argument package is supplied, only imports will + be returned. + See test cases for examples.""" + for child in node.children: + ret = None + if child.type == syms.for_stmt: + if _find(name, child.children[1]): + return child + n = find_binding(name, make_suite(child.children[-1]), package) + if n: ret = n + elif child.type in (syms.if_stmt, syms.while_stmt): + n = find_binding(name, make_suite(child.children[-1]), package) + if n: ret = n + elif child.type == syms.try_stmt: + n = find_binding(name, make_suite(child.children[2]), package) + if n: + ret = n + else: + for i, kid in enumerate(child.children[3:]): + if kid.type == token.COLON and kid.value == ":": + # i+3 is the colon, i+4 is the suite + n = find_binding(name, make_suite(child.children[i+4]), package) + if n: ret = n + elif child.type in _def_syms and child.children[1].value == name: + ret = child + elif _is_import_binding(child, name, package): + ret = child + elif child.type == syms.simple_stmt: + ret = find_binding(name, child, package) + elif child.type == syms.expr_stmt: + if _find(name, child.children[0]): + ret = child + + if ret: + if not package: + return ret + if is_import(ret): + return ret + return None + +_block_syms = set([syms.funcdef, syms.classdef, syms.trailer]) +def _find(name, node): + nodes = [node] + while nodes: + node = nodes.pop() + if node.type > 256 and node.type not in _block_syms: + nodes.extend(node.children) + elif node.type == token.NAME and node.value == name: + return node + return None + +def _is_import_binding(node, name, package=None): + """ Will reuturn node if node will import name, or node + will import * from package. None is returned otherwise. + See test cases for examples. """ + + if node.type == syms.import_name and not package: + imp = node.children[1] + if imp.type == syms.dotted_as_names: + for child in imp.children: + if child.type == syms.dotted_as_name: + if child.children[2].value == name: + return node + elif child.type == token.NAME and child.value == name: + return node + elif imp.type == syms.dotted_as_name: + last = imp.children[-1] + if last.type == token.NAME and last.value == name: + return node + elif imp.type == token.NAME and imp.value == name: + return node + elif node.type == syms.import_from: + # unicode(...) is used to make life easier here, because + # from a.b import parses to ['import', ['a', '.', 'b'], ...] + if package and unicode(node.children[1]).strip() != package: + return None + n = node.children[3] + if package and _find(u"as", n): + # See test_from_import_as for explanation + return None + elif n.type == syms.import_as_names and _find(name, n): + return node + elif n.type == syms.import_as_name: + child = n.children[2] + if child.type == token.NAME and child.value == name: + return node + elif n.type == token.NAME and n.value == name: + return node + elif package and n.type == token.STAR: + return node + return None diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/__init__.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/__init__.py new file mode 100644 index 000000000000..b93054b3ecf3 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/__init__.py @@ -0,0 +1 @@ +# Dummy file to make this directory a package. diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_apply.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_apply.py new file mode 100644 index 000000000000..a7dc3a046d8f --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_apply.py @@ -0,0 +1,59 @@ +# Copyright 2006 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer for apply(). + +This converts apply(func, v, k) into (func)(*v, **k).""" + +# Local imports +from .. import pytree +from ..pgen2 import token +from .. import fixer_base +from ..fixer_util import Call, Comma, parenthesize + +class FixApply(fixer_base.BaseFix): + BM_compatible = True + + PATTERN = """ + power< 'apply' + trailer< + '(' + arglist< + (not argument + ')' + > + > + """ + + def transform(self, node, results): + syms = self.syms + assert results + func = results["func"] + args = results["args"] + kwds = results.get("kwds") + prefix = node.prefix + func = func.clone() + if (func.type not in (token.NAME, syms.atom) and + (func.type != syms.power or + func.children[-2].type == token.DOUBLESTAR)): + # Need to parenthesize + func = parenthesize(func) + func.prefix = "" + args = args.clone() + args.prefix = "" + if kwds is not None: + kwds = kwds.clone() + kwds.prefix = "" + l_newargs = [pytree.Leaf(token.STAR, u"*"), args] + if kwds is not None: + l_newargs.extend([Comma(), + pytree.Leaf(token.DOUBLESTAR, u"**"), + kwds]) + l_newargs[-2].prefix = u" " # that's the ** token + # XXX Sometimes we could be cleverer, e.g. apply(f, (x, y) + t) + # can be translated into f(x, y, *t) instead of f(*(x, y) + t) + #new = pytree.Node(syms.power, (func, ArgList(l_newargs))) + return Call(func, l_newargs, prefix=prefix) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_basestring.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_basestring.py new file mode 100644 index 000000000000..a3c9a436492e --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_basestring.py @@ -0,0 +1,14 @@ +"""Fixer for basestring -> str.""" +# Author: Christian Heimes + +# Local imports +from .. import fixer_base +from ..fixer_util import Name + +class FixBasestring(fixer_base.BaseFix): + BM_compatible = True + + PATTERN = "'basestring'" + + def transform(self, node, results): + return Name(u"str", prefix=node.prefix) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_buffer.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_buffer.py new file mode 100644 index 000000000000..c6b092802480 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_buffer.py @@ -0,0 +1,22 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer that changes buffer(...) into memoryview(...).""" + +# Local imports +from .. import fixer_base +from ..fixer_util import Name + + +class FixBuffer(fixer_base.BaseFix): + BM_compatible = True + + explicit = True # The user must ask for this fixer + + PATTERN = """ + power< name='buffer' trailer< '(' [any] ')' > any* > + """ + + def transform(self, node, results): + name = results["name"] + name.replace(Name(u"memoryview", prefix=name.prefix)) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_callable.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_callable.py new file mode 100644 index 000000000000..df33d614ba1b --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_callable.py @@ -0,0 +1,37 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer for callable(). + +This converts callable(obj) into isinstance(obj, collections.Callable), adding a +collections import if needed.""" + +# Local imports +from lib2to3 import fixer_base +from lib2to3.fixer_util import Call, Name, String, Attr, touch_import + +class FixCallable(fixer_base.BaseFix): + BM_compatible = True + + order = "pre" + + # Ignore callable(*args) or use of keywords. + # Either could be a hint that the builtin callable() is not being used. + PATTERN = """ + power< 'callable' + trailer< lpar='(' + ( not(arglist | argument) any ','> ) + rpar=')' > + after=any* + > + """ + + def transform(self, node, results): + func = results['func'] + + touch_import(None, u'collections', node=node) + + args = [func.clone(), String(u', ')] + args.extend(Attr(Name(u'collections'), Name(u'Callable'))) + return Call(Name(u'isinstance'), args, prefix=node.prefix) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_dict.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_dict.py new file mode 100644 index 000000000000..c3263309eec6 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_dict.py @@ -0,0 +1,106 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer for dict methods. + +d.keys() -> list(d.keys()) +d.items() -> list(d.items()) +d.values() -> list(d.values()) + +d.iterkeys() -> iter(d.keys()) +d.iteritems() -> iter(d.items()) +d.itervalues() -> iter(d.values()) + +d.viewkeys() -> d.keys() +d.viewitems() -> d.items() +d.viewvalues() -> d.values() + +Except in certain very specific contexts: the iter() can be dropped +when the context is list(), sorted(), iter() or for...in; the list() +can be dropped when the context is list() or sorted() (but not iter() +or for...in!). Special contexts that apply to both: list(), sorted(), tuple() +set(), any(), all(), sum(). + +Note: iter(d.keys()) could be written as iter(d) but since the +original d.iterkeys() was also redundant we don't fix this. And there +are (rare) contexts where it makes a difference (e.g. when passing it +as an argument to a function that introspects the argument). +""" + +# Local imports +from .. import pytree +from .. import patcomp +from .. import fixer_base +from ..fixer_util import Name, Call, Dot +from .. import fixer_util + + +iter_exempt = fixer_util.consuming_calls | set(["iter"]) + + +class FixDict(fixer_base.BaseFix): + BM_compatible = True + + PATTERN = """ + power< head=any+ + trailer< '.' method=('keys'|'items'|'values'| + 'iterkeys'|'iteritems'|'itervalues'| + 'viewkeys'|'viewitems'|'viewvalues') > + parens=trailer< '(' ')' > + tail=any* + > + """ + + def transform(self, node, results): + head = results["head"] + method = results["method"][0] # Extract node for method name + tail = results["tail"] + syms = self.syms + method_name = method.value + isiter = method_name.startswith(u"iter") + isview = method_name.startswith(u"view") + if isiter or isview: + method_name = method_name[4:] + assert method_name in (u"keys", u"items", u"values"), repr(method) + head = [n.clone() for n in head] + tail = [n.clone() for n in tail] + special = not tail and self.in_special_context(node, isiter) + args = head + [pytree.Node(syms.trailer, + [Dot(), + Name(method_name, + prefix=method.prefix)]), + results["parens"].clone()] + new = pytree.Node(syms.power, args) + if not (special or isview): + new.prefix = u"" + new = Call(Name(u"iter" if isiter else u"list"), [new]) + if tail: + new = pytree.Node(syms.power, [new] + tail) + new.prefix = node.prefix + return new + + P1 = "power< func=NAME trailer< '(' node=any ')' > any* >" + p1 = patcomp.compile_pattern(P1) + + P2 = """for_stmt< 'for' any 'in' node=any ':' any* > + | comp_for< 'for' any 'in' node=any any* > + """ + p2 = patcomp.compile_pattern(P2) + + def in_special_context(self, node, isiter): + if node.parent is None: + return False + results = {} + if (node.parent.parent is not None and + self.p1.match(node.parent.parent, results) and + results["node"] is node): + if isiter: + # iter(d.iterkeys()) -> iter(d.keys()), etc. + return results["func"].value in iter_exempt + else: + # list(d.keys()) -> list(d.keys()), etc. + return results["func"].value in fixer_util.consuming_calls + if not isiter: + return False + # for ... in d.iterkeys() -> for ... in d.keys(), etc. + return self.p2.match(node.parent, results) and results["node"] is node diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_except.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_except.py new file mode 100644 index 000000000000..e324718f6490 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_except.py @@ -0,0 +1,93 @@ +"""Fixer for except statements with named exceptions. + +The following cases will be converted: + +- "except E, T:" where T is a name: + + except E as T: + +- "except E, T:" where T is not a name, tuple or list: + + except E as t: + T = t + + This is done because the target of an "except" clause must be a + name. + +- "except E, T:" where T is a tuple or list literal: + + except E as t: + T = t.args +""" +# Author: Collin Winter + +# Local imports +from .. import pytree +from ..pgen2 import token +from .. import fixer_base +from ..fixer_util import Assign, Attr, Name, is_tuple, is_list, syms + +def find_excepts(nodes): + for i, n in enumerate(nodes): + if n.type == syms.except_clause: + if n.children[0].value == u'except': + yield (n, nodes[i+2]) + +class FixExcept(fixer_base.BaseFix): + BM_compatible = True + + PATTERN = """ + try_stmt< 'try' ':' (simple_stmt | suite) + cleanup=(except_clause ':' (simple_stmt | suite))+ + tail=(['except' ':' (simple_stmt | suite)] + ['else' ':' (simple_stmt | suite)] + ['finally' ':' (simple_stmt | suite)]) > + """ + + def transform(self, node, results): + syms = self.syms + + tail = [n.clone() for n in results["tail"]] + + try_cleanup = [ch.clone() for ch in results["cleanup"]] + for except_clause, e_suite in find_excepts(try_cleanup): + if len(except_clause.children) == 4: + (E, comma, N) = except_clause.children[1:4] + comma.replace(Name(u"as", prefix=u" ")) + + if N.type != token.NAME: + # Generate a new N for the except clause + new_N = Name(self.new_name(), prefix=u" ") + target = N.clone() + target.prefix = u"" + N.replace(new_N) + new_N = new_N.clone() + + # Insert "old_N = new_N" as the first statement in + # the except body. This loop skips leading whitespace + # and indents + #TODO(cwinter) suite-cleanup + suite_stmts = e_suite.children + for i, stmt in enumerate(suite_stmts): + if isinstance(stmt, pytree.Node): + break + + # The assignment is different if old_N is a tuple or list + # In that case, the assignment is old_N = new_N.args + if is_tuple(N) or is_list(N): + assign = Assign(target, Attr(new_N, Name(u'args'))) + else: + assign = Assign(target, new_N) + + #TODO(cwinter) stopgap until children becomes a smart list + for child in reversed(suite_stmts[:i]): + e_suite.insert_child(0, child) + e_suite.insert_child(i, assign) + elif N.prefix == u"": + # No space after a comma is legal; no space after "as", + # not so much. + N.prefix = u" " + + #TODO(cwinter) fix this when children becomes a smart list + children = [c.clone() for c in node.children[:3]] + try_cleanup + tail + return pytree.Node(node.type, children) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_exec.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_exec.py new file mode 100644 index 000000000000..5500302f4e44 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_exec.py @@ -0,0 +1,39 @@ +# Copyright 2006 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer for exec. + +This converts usages of the exec statement into calls to a built-in +exec() function. + +exec code in ns1, ns2 -> exec(code, ns1, ns2) +""" + +# Local imports +from .. import fixer_base +from ..fixer_util import Comma, Name, Call + + +class FixExec(fixer_base.BaseFix): + BM_compatible = True + + PATTERN = """ + exec_stmt< 'exec' a=any 'in' b=any [',' c=any] > + | + exec_stmt< 'exec' (not atom<'(' [any] ')'>) a=any > + """ + + def transform(self, node, results): + assert results + syms = self.syms + a = results["a"] + b = results.get("b") + c = results.get("c") + args = [a.clone()] + args[0].prefix = "" + if b is not None: + args.extend([Comma(), b.clone()]) + if c is not None: + args.extend([Comma(), c.clone()]) + + return Call(Name(u"exec"), args, prefix=node.prefix) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_execfile.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_execfile.py new file mode 100644 index 000000000000..2f29d3b281a9 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_execfile.py @@ -0,0 +1,52 @@ +# Copyright 2006 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer for execfile. + +This converts usages of the execfile function into calls to the built-in +exec() function. +""" + +from .. import fixer_base +from ..fixer_util import (Comma, Name, Call, LParen, RParen, Dot, Node, + ArgList, String, syms) + + +class FixExecfile(fixer_base.BaseFix): + BM_compatible = True + + PATTERN = """ + power< 'execfile' trailer< '(' arglist< filename=any [',' globals=any [',' locals=any ] ] > ')' > > + | + power< 'execfile' trailer< '(' filename=any ')' > > + """ + + def transform(self, node, results): + assert results + filename = results["filename"] + globals = results.get("globals") + locals = results.get("locals") + + # Copy over the prefix from the right parentheses end of the execfile + # call. + execfile_paren = node.children[-1].children[-1].clone() + # Construct open().read(). + open_args = ArgList([filename.clone()], rparen=execfile_paren) + open_call = Node(syms.power, [Name(u"open"), open_args]) + read = [Node(syms.trailer, [Dot(), Name(u'read')]), + Node(syms.trailer, [LParen(), RParen()])] + open_expr = [open_call] + read + # Wrap the open call in a compile call. This is so the filename will be + # preserved in the execed code. + filename_arg = filename.clone() + filename_arg.prefix = u" " + exec_str = String(u"'exec'", u" ") + compile_args = open_expr + [Comma(), filename_arg, Comma(), exec_str] + compile_call = Call(Name(u"compile"), compile_args, u"") + # Finally, replace the execfile call with an exec call. + args = [compile_call] + if globals is not None: + args.extend([Comma(), globals.clone()]) + if locals is not None: + args.extend([Comma(), locals.clone()]) + return Call(Name(u"exec"), args, prefix=node.prefix) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_exitfunc.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_exitfunc.py new file mode 100644 index 000000000000..89fb3db53367 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_exitfunc.py @@ -0,0 +1,72 @@ +""" +Convert use of sys.exitfunc to use the atexit module. +""" + +# Author: Benjamin Peterson + +from lib2to3 import pytree, fixer_base +from lib2to3.fixer_util import Name, Attr, Call, Comma, Newline, syms + + +class FixExitfunc(fixer_base.BaseFix): + keep_line_order = True + BM_compatible = True + + PATTERN = """ + ( + sys_import=import_name<'import' + ('sys' + | + dotted_as_names< (any ',')* 'sys' (',' any)* > + ) + > + | + expr_stmt< + power< 'sys' trailer< '.' 'exitfunc' > > + '=' func=any > + ) + """ + + def __init__(self, *args): + super(FixExitfunc, self).__init__(*args) + + def start_tree(self, tree, filename): + super(FixExitfunc, self).start_tree(tree, filename) + self.sys_import = None + + def transform(self, node, results): + # First, find a the sys import. We'll just hope it's global scope. + if "sys_import" in results: + if self.sys_import is None: + self.sys_import = results["sys_import"] + return + + func = results["func"].clone() + func.prefix = u"" + register = pytree.Node(syms.power, + Attr(Name(u"atexit"), Name(u"register")) + ) + call = Call(register, [func], node.prefix) + node.replace(call) + + if self.sys_import is None: + # That's interesting. + self.warning(node, "Can't find sys import; Please add an atexit " + "import at the top of your file.") + return + + # Now add an atexit import after the sys import. + names = self.sys_import.children[1] + if names.type == syms.dotted_as_names: + names.append_child(Comma()) + names.append_child(Name(u"atexit", u" ")) + else: + containing_stmt = self.sys_import.parent + position = containing_stmt.children.index(self.sys_import) + stmt_container = containing_stmt.parent + new_import = pytree.Node(syms.import_name, + [Name(u"import"), Name(u"atexit", u" ")] + ) + new = pytree.Node(syms.simple_stmt, [new_import]) + containing_stmt.insert_child(position + 1, Newline()) + containing_stmt.insert_child(position + 2, new) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_filter.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_filter.py new file mode 100644 index 000000000000..4cca0b4ebc26 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_filter.py @@ -0,0 +1,75 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer that changes filter(F, X) into list(filter(F, X)). + +We avoid the transformation if the filter() call is directly contained +in iter(<>), list(<>), tuple(<>), sorted(<>), ...join(<>), or +for V in <>:. + +NOTE: This is still not correct if the original code was depending on +filter(F, X) to return a string if X is a string and a tuple if X is a +tuple. That would require type inference, which we don't do. Let +Python 2.6 figure it out. +""" + +# Local imports +from .. import fixer_base +from ..fixer_util import Name, Call, ListComp, in_special_context + +class FixFilter(fixer_base.ConditionalFix): + BM_compatible = True + + PATTERN = """ + filter_lambda=power< + 'filter' + trailer< + '(' + arglist< + lambdef< 'lambda' + (fp=NAME | vfpdef< '(' fp=NAME ')'> ) ':' xp=any + > + ',' + it=any + > + ')' + > + > + | + power< + 'filter' + trailer< '(' arglist< none='None' ',' seq=any > ')' > + > + | + power< + 'filter' + args=trailer< '(' [any] ')' > + > + """ + + skip_on = "future_builtins.filter" + + def transform(self, node, results): + if self.should_skip(node): + return + + if "filter_lambda" in results: + new = ListComp(results.get("fp").clone(), + results.get("fp").clone(), + results.get("it").clone(), + results.get("xp").clone()) + + elif "none" in results: + new = ListComp(Name(u"_f"), + Name(u"_f"), + results["seq"].clone(), + Name(u"_f")) + + else: + if in_special_context(node): + return None + new = node.clone() + new.prefix = u"" + new = Call(Name(u"list"), [new]) + new.prefix = node.prefix + return new diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_funcattrs.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_funcattrs.py new file mode 100644 index 000000000000..9e45c028574f --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_funcattrs.py @@ -0,0 +1,21 @@ +"""Fix function attribute names (f.func_x -> f.__x__).""" +# Author: Collin Winter + +# Local imports +from .. import fixer_base +from ..fixer_util import Name + + +class FixFuncattrs(fixer_base.BaseFix): + BM_compatible = True + + PATTERN = """ + power< any+ trailer< '.' attr=('func_closure' | 'func_doc' | 'func_globals' + | 'func_name' | 'func_defaults' | 'func_code' + | 'func_dict') > any* > + """ + + def transform(self, node, results): + attr = results["attr"][0] + attr.replace(Name((u"__%s__" % attr.value[5:]), + prefix=attr.prefix)) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_future.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_future.py new file mode 100644 index 000000000000..fbcb86af0791 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_future.py @@ -0,0 +1,22 @@ +"""Remove __future__ imports + +from __future__ import foo is replaced with an empty line. +""" +# Author: Christian Heimes + +# Local imports +from .. import fixer_base +from ..fixer_util import BlankLine + +class FixFuture(fixer_base.BaseFix): + BM_compatible = True + + PATTERN = """import_from< 'from' module_name="__future__" 'import' any >""" + + # This should be run last -- some things check for the import + run_order = 10 + + def transform(self, node, results): + new = BlankLine() + new.prefix = node.prefix + return new diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_getcwdu.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_getcwdu.py new file mode 100644 index 000000000000..82233c8993b3 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_getcwdu.py @@ -0,0 +1,19 @@ +""" +Fixer that changes os.getcwdu() to os.getcwd(). +""" +# Author: Victor Stinner + +# Local imports +from .. import fixer_base +from ..fixer_util import Name + +class FixGetcwdu(fixer_base.BaseFix): + BM_compatible = True + + PATTERN = """ + power< 'os' trailer< dot='.' name='getcwdu' > any* > + """ + + def transform(self, node, results): + name = results["name"] + name.replace(Name(u"getcwd", prefix=name.prefix)) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_has_key.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_has_key.py new file mode 100644 index 000000000000..1b3853491942 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_has_key.py @@ -0,0 +1,109 @@ +# Copyright 2006 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer for has_key(). + +Calls to .has_key() methods are expressed in terms of the 'in' +operator: + + d.has_key(k) -> k in d + +CAVEATS: +1) While the primary target of this fixer is dict.has_key(), the + fixer will change any has_key() method call, regardless of its + class. + +2) Cases like this will not be converted: + + m = d.has_key + if m(k): + ... + + Only *calls* to has_key() are converted. While it is possible to + convert the above to something like + + m = d.__contains__ + if m(k): + ... + + this is currently not done. +""" + +# Local imports +from .. import pytree +from .. import fixer_base +from ..fixer_util import Name, parenthesize + + +class FixHasKey(fixer_base.BaseFix): + BM_compatible = True + + PATTERN = """ + anchor=power< + before=any+ + trailer< '.' 'has_key' > + trailer< + '(' + ( not(arglist | argument) arg=any ','> + ) + ')' + > + after=any* + > + | + negation=not_test< + 'not' + anchor=power< + before=any+ + trailer< '.' 'has_key' > + trailer< + '(' + ( not(arglist | argument) arg=any ','> + ) + ')' + > + > + > + """ + + def transform(self, node, results): + assert results + syms = self.syms + if (node.parent.type == syms.not_test and + self.pattern.match(node.parent)): + # Don't transform a node matching the first alternative of the + # pattern when its parent matches the second alternative + return None + negation = results.get("negation") + anchor = results["anchor"] + prefix = node.prefix + before = [n.clone() for n in results["before"]] + arg = results["arg"].clone() + after = results.get("after") + if after: + after = [n.clone() for n in after] + if arg.type in (syms.comparison, syms.not_test, syms.and_test, + syms.or_test, syms.test, syms.lambdef, syms.argument): + arg = parenthesize(arg) + if len(before) == 1: + before = before[0] + else: + before = pytree.Node(syms.power, before) + before.prefix = u" " + n_op = Name(u"in", prefix=u" ") + if negation: + n_not = Name(u"not", prefix=u" ") + n_op = pytree.Node(syms.comp_op, (n_not, n_op)) + new = pytree.Node(syms.comparison, (arg, n_op, before)) + if after: + new = parenthesize(new) + new = pytree.Node(syms.power, (new,) + tuple(after)) + if node.parent.type in (syms.comparison, syms.expr, syms.xor_expr, + syms.and_expr, syms.shift_expr, + syms.arith_expr, syms.term, + syms.factor, syms.power): + new = parenthesize(new) + new.prefix = prefix + return new diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_idioms.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_idioms.py new file mode 100644 index 000000000000..37b6eefa5134 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_idioms.py @@ -0,0 +1,152 @@ +"""Adjust some old Python 2 idioms to their modern counterparts. + +* Change some type comparisons to isinstance() calls: + type(x) == T -> isinstance(x, T) + type(x) is T -> isinstance(x, T) + type(x) != T -> not isinstance(x, T) + type(x) is not T -> not isinstance(x, T) + +* Change "while 1:" into "while True:". + +* Change both + + v = list(EXPR) + v.sort() + foo(v) + +and the more general + + v = EXPR + v.sort() + foo(v) + +into + + v = sorted(EXPR) + foo(v) +""" +# Author: Jacques Frechet, Collin Winter + +# Local imports +from .. import fixer_base +from ..fixer_util import Call, Comma, Name, Node, BlankLine, syms + +CMP = "(n='!=' | '==' | 'is' | n=comp_op< 'is' 'not' >)" +TYPE = "power< 'type' trailer< '(' x=any ')' > >" + +class FixIdioms(fixer_base.BaseFix): + explicit = True # The user must ask for this fixer + + PATTERN = r""" + isinstance=comparison< %s %s T=any > + | + isinstance=comparison< T=any %s %s > + | + while_stmt< 'while' while='1' ':' any+ > + | + sorted=any< + any* + simple_stmt< + expr_stmt< id1=any '=' + power< list='list' trailer< '(' (not arglist) any ')' > > + > + '\n' + > + sort= + simple_stmt< + power< id2=any + trailer< '.' 'sort' > trailer< '(' ')' > + > + '\n' + > + next=any* + > + | + sorted=any< + any* + simple_stmt< expr_stmt< id1=any '=' expr=any > '\n' > + sort= + simple_stmt< + power< id2=any + trailer< '.' 'sort' > trailer< '(' ')' > + > + '\n' + > + next=any* + > + """ % (TYPE, CMP, CMP, TYPE) + + def match(self, node): + r = super(FixIdioms, self).match(node) + # If we've matched one of the sort/sorted subpatterns above, we + # want to reject matches where the initial assignment and the + # subsequent .sort() call involve different identifiers. + if r and "sorted" in r: + if r["id1"] == r["id2"]: + return r + return None + return r + + def transform(self, node, results): + if "isinstance" in results: + return self.transform_isinstance(node, results) + elif "while" in results: + return self.transform_while(node, results) + elif "sorted" in results: + return self.transform_sort(node, results) + else: + raise RuntimeError("Invalid match") + + def transform_isinstance(self, node, results): + x = results["x"].clone() # The thing inside of type() + T = results["T"].clone() # The type being compared against + x.prefix = u"" + T.prefix = u" " + test = Call(Name(u"isinstance"), [x, Comma(), T]) + if "n" in results: + test.prefix = u" " + test = Node(syms.not_test, [Name(u"not"), test]) + test.prefix = node.prefix + return test + + def transform_while(self, node, results): + one = results["while"] + one.replace(Name(u"True", prefix=one.prefix)) + + def transform_sort(self, node, results): + sort_stmt = results["sort"] + next_stmt = results["next"] + list_call = results.get("list") + simple_expr = results.get("expr") + + if list_call: + list_call.replace(Name(u"sorted", prefix=list_call.prefix)) + elif simple_expr: + new = simple_expr.clone() + new.prefix = u"" + simple_expr.replace(Call(Name(u"sorted"), [new], + prefix=simple_expr.prefix)) + else: + raise RuntimeError("should not have reached here") + sort_stmt.remove() + + btwn = sort_stmt.prefix + # Keep any prefix lines between the sort_stmt and the list_call and + # shove them right after the sorted() call. + if u"\n" in btwn: + if next_stmt: + # The new prefix should be everything from the sort_stmt's + # prefix up to the last newline, then the old prefix after a new + # line. + prefix_lines = (btwn.rpartition(u"\n")[0], next_stmt[0].prefix) + next_stmt[0].prefix = u"\n".join(prefix_lines) + else: + assert list_call.parent + assert list_call.next_sibling is None + # Put a blank line after list_call and set its prefix. + end_line = BlankLine() + list_call.parent.append_child(end_line) + assert list_call.next_sibling is end_line + # The new prefix should be everything up to the first new line + # of sort_stmt's prefix. + end_line.prefix = btwn.rpartition(u"\n")[0] diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_import.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_import.py new file mode 100644 index 000000000000..201e811e619a --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_import.py @@ -0,0 +1,99 @@ +"""Fixer for import statements. +If spam is being imported from the local directory, this import: + from spam import eggs +Becomes: + from .spam import eggs + +And this import: + import spam +Becomes: + from . import spam +""" + +# Local imports +from .. import fixer_base +from os.path import dirname, join, exists, sep +from ..fixer_util import FromImport, syms, token + + +def traverse_imports(names): + """ + Walks over all the names imported in a dotted_as_names node. + """ + pending = [names] + while pending: + node = pending.pop() + if node.type == token.NAME: + yield node.value + elif node.type == syms.dotted_name: + yield "".join([ch.value for ch in node.children]) + elif node.type == syms.dotted_as_name: + pending.append(node.children[0]) + elif node.type == syms.dotted_as_names: + pending.extend(node.children[::-2]) + else: + raise AssertionError("unkown node type") + + +class FixImport(fixer_base.BaseFix): + BM_compatible = True + + PATTERN = """ + import_from< 'from' imp=any 'import' ['('] any [')'] > + | + import_name< 'import' imp=any > + """ + + def start_tree(self, tree, name): + super(FixImport, self).start_tree(tree, name) + self.skip = "absolute_import" in tree.future_features + + def transform(self, node, results): + if self.skip: + return + imp = results['imp'] + + if node.type == syms.import_from: + # Some imps are top-level (eg: 'import ham') + # some are first level (eg: 'import ham.eggs') + # some are third level (eg: 'import ham.eggs as spam') + # Hence, the loop + while not hasattr(imp, 'value'): + imp = imp.children[0] + if self.probably_a_local_import(imp.value): + imp.value = u"." + imp.value + imp.changed() + else: + have_local = False + have_absolute = False + for mod_name in traverse_imports(imp): + if self.probably_a_local_import(mod_name): + have_local = True + else: + have_absolute = True + if have_absolute: + if have_local: + # We won't handle both sibling and absolute imports in the + # same statement at the moment. + self.warning(node, "absolute and local imports together") + return + + new = FromImport(u".", [imp]) + new.prefix = node.prefix + return new + + def probably_a_local_import(self, imp_name): + if imp_name.startswith(u"."): + # Relative imports are certainly not local imports. + return False + imp_name = imp_name.split(u".", 1)[0] + base_path = dirname(self.filename) + base_path = join(base_path, imp_name) + # If there is no __init__.py next to the file its not in a package + # so can't be a relative import. + if not exists(join(dirname(base_path), "__init__.py")): + return False + for ext in [".py", sep, ".pyc", ".so", ".sl", ".pyd"]: + if exists(base_path + ext): + return True + return False diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_imports.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_imports.py new file mode 100644 index 000000000000..93c9e6787b16 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_imports.py @@ -0,0 +1,145 @@ +"""Fix incompatible imports and module references.""" +# Authors: Collin Winter, Nick Edds + +# Local imports +from .. import fixer_base +from ..fixer_util import Name, attr_chain + +MAPPING = {'StringIO': 'io', + 'cStringIO': 'io', + 'cPickle': 'pickle', + '__builtin__' : 'builtins', + 'copy_reg': 'copyreg', + 'Queue': 'queue', + 'SocketServer': 'socketserver', + 'ConfigParser': 'configparser', + 'repr': 'reprlib', + 'FileDialog': 'tkinter.filedialog', + 'tkFileDialog': 'tkinter.filedialog', + 'SimpleDialog': 'tkinter.simpledialog', + 'tkSimpleDialog': 'tkinter.simpledialog', + 'tkColorChooser': 'tkinter.colorchooser', + 'tkCommonDialog': 'tkinter.commondialog', + 'Dialog': 'tkinter.dialog', + 'Tkdnd': 'tkinter.dnd', + 'tkFont': 'tkinter.font', + 'tkMessageBox': 'tkinter.messagebox', + 'ScrolledText': 'tkinter.scrolledtext', + 'Tkconstants': 'tkinter.constants', + 'Tix': 'tkinter.tix', + 'ttk': 'tkinter.ttk', + 'Tkinter': 'tkinter', + 'markupbase': '_markupbase', + '_winreg': 'winreg', + 'thread': '_thread', + 'dummy_thread': '_dummy_thread', + # anydbm and whichdb are handled by fix_imports2 + 'dbhash': 'dbm.bsd', + 'dumbdbm': 'dbm.dumb', + 'dbm': 'dbm.ndbm', + 'gdbm': 'dbm.gnu', + 'xmlrpclib': 'xmlrpc.client', + 'DocXMLRPCServer': 'xmlrpc.server', + 'SimpleXMLRPCServer': 'xmlrpc.server', + 'httplib': 'http.client', + 'htmlentitydefs' : 'html.entities', + 'HTMLParser' : 'html.parser', + 'Cookie': 'http.cookies', + 'cookielib': 'http.cookiejar', + 'BaseHTTPServer': 'http.server', + 'SimpleHTTPServer': 'http.server', + 'CGIHTTPServer': 'http.server', + #'test.test_support': 'test.support', + 'commands': 'subprocess', + 'UserString' : 'collections', + 'UserList' : 'collections', + 'urlparse' : 'urllib.parse', + 'robotparser' : 'urllib.robotparser', +} + + +def alternates(members): + return "(" + "|".join(map(repr, members)) + ")" + + +def build_pattern(mapping=MAPPING): + mod_list = ' | '.join(["module_name='%s'" % key for key in mapping]) + bare_names = alternates(mapping.keys()) + + yield """name_import=import_name< 'import' ((%s) | + multiple_imports=dotted_as_names< any* (%s) any* >) > + """ % (mod_list, mod_list) + yield """import_from< 'from' (%s) 'import' ['('] + ( any | import_as_name< any 'as' any > | + import_as_names< any* >) [')'] > + """ % mod_list + yield """import_name< 'import' (dotted_as_name< (%s) 'as' any > | + multiple_imports=dotted_as_names< + any* dotted_as_name< (%s) 'as' any > any* >) > + """ % (mod_list, mod_list) + + # Find usages of module members in code e.g. thread.foo(bar) + yield "power< bare_with_attr=(%s) trailer<'.' any > any* >" % bare_names + + +class FixImports(fixer_base.BaseFix): + + BM_compatible = True + keep_line_order = True + # This is overridden in fix_imports2. + mapping = MAPPING + + # We want to run this fixer late, so fix_import doesn't try to make stdlib + # renames into relative imports. + run_order = 6 + + def build_pattern(self): + return "|".join(build_pattern(self.mapping)) + + def compile_pattern(self): + # We override this, so MAPPING can be pragmatically altered and the + # changes will be reflected in PATTERN. + self.PATTERN = self.build_pattern() + super(FixImports, self).compile_pattern() + + # Don't match the node if it's within another match. + def match(self, node): + match = super(FixImports, self).match + results = match(node) + if results: + # Module usage could be in the trailer of an attribute lookup, so we + # might have nested matches when "bare_with_attr" is present. + if "bare_with_attr" not in results and \ + any(match(obj) for obj in attr_chain(node, "parent")): + return False + return results + return False + + def start_tree(self, tree, filename): + super(FixImports, self).start_tree(tree, filename) + self.replace = {} + + def transform(self, node, results): + import_mod = results.get("module_name") + if import_mod: + mod_name = import_mod.value + new_name = unicode(self.mapping[mod_name]) + import_mod.replace(Name(new_name, prefix=import_mod.prefix)) + if "name_import" in results: + # If it's not a "from x import x, y" or "import x as y" import, + # marked its usage to be replaced. + self.replace[mod_name] = new_name + if "multiple_imports" in results: + # This is a nasty hack to fix multiple imports on a line (e.g., + # "import StringIO, urlparse"). The problem is that I can't + # figure out an easy way to make a pattern recognize the keys of + # MAPPING randomly sprinkled in an import statement. + results = self.match(node) + if results: + self.transform(node, results) + else: + # Replace usage of the module. + bare_name = results["bare_with_attr"][0] + new_name = self.replace.get(bare_name.value) + if new_name: + bare_name.replace(Name(new_name, prefix=bare_name.prefix)) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_imports2.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_imports2.py new file mode 100644 index 000000000000..9a33c67b1dc1 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_imports2.py @@ -0,0 +1,16 @@ +"""Fix incompatible imports and module references that must be fixed after +fix_imports.""" +from . import fix_imports + + +MAPPING = { + 'whichdb': 'dbm', + 'anydbm': 'dbm', + } + + +class FixImports2(fix_imports.FixImports): + + run_order = 7 + + mapping = MAPPING diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_input.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_input.py new file mode 100644 index 000000000000..fbf4c72f5c9d --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_input.py @@ -0,0 +1,26 @@ +"""Fixer that changes input(...) into eval(input(...)).""" +# Author: Andre Roberge + +# Local imports +from .. import fixer_base +from ..fixer_util import Call, Name +from .. import patcomp + + +context = patcomp.compile_pattern("power< 'eval' trailer< '(' any ')' > >") + + +class FixInput(fixer_base.BaseFix): + BM_compatible = True + PATTERN = """ + power< 'input' args=trailer< '(' [any] ')' > > + """ + + def transform(self, node, results): + # If we're already wrapped in a eval() call, we're done. + if context.match(node.parent.parent): + return + + new = node.clone() + new.prefix = u"" + return Call(Name(u"eval"), [new], prefix=node.prefix) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_intern.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_intern.py new file mode 100644 index 000000000000..e7bb5052b4b5 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_intern.py @@ -0,0 +1,46 @@ +# Copyright 2006 Georg Brandl. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer for intern(). + +intern(s) -> sys.intern(s)""" + +# Local imports +from .. import pytree +from .. import fixer_base +from ..fixer_util import Name, Attr, touch_import + + +class FixIntern(fixer_base.BaseFix): + BM_compatible = True + order = "pre" + + PATTERN = """ + power< 'intern' + trailer< lpar='(' + ( not(arglist | argument) any ','> ) + rpar=')' > + after=any* + > + """ + + def transform(self, node, results): + syms = self.syms + obj = results["obj"].clone() + if obj.type == syms.arglist: + newarglist = obj.clone() + else: + newarglist = pytree.Node(syms.arglist, [obj.clone()]) + after = results["after"] + if after: + after = [n.clone() for n in after] + new = pytree.Node(syms.power, + Attr(Name(u"sys"), Name(u"intern")) + + [pytree.Node(syms.trailer, + [results["lpar"].clone(), + newarglist, + results["rpar"].clone()])] + after) + new.prefix = node.prefix + touch_import(None, u'sys', node) + return new diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_isinstance.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_isinstance.py new file mode 100644 index 000000000000..4b04c8fd0c66 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_isinstance.py @@ -0,0 +1,52 @@ +# Copyright 2008 Armin Ronacher. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer that cleans up a tuple argument to isinstance after the tokens +in it were fixed. This is mainly used to remove double occurrences of +tokens as a leftover of the long -> int / unicode -> str conversion. + +eg. isinstance(x, (int, long)) -> isinstance(x, (int, int)) + -> isinstance(x, int) +""" + +from .. import fixer_base +from ..fixer_util import token + + +class FixIsinstance(fixer_base.BaseFix): + BM_compatible = True + PATTERN = """ + power< + 'isinstance' + trailer< '(' arglist< any ',' atom< '(' + args=testlist_gexp< any+ > + ')' > > ')' > + > + """ + + run_order = 6 + + def transform(self, node, results): + names_inserted = set() + testlist = results["args"] + args = testlist.children + new_args = [] + iterator = enumerate(args) + for idx, arg in iterator: + if arg.type == token.NAME and arg.value in names_inserted: + if idx < len(args) - 1 and args[idx + 1].type == token.COMMA: + iterator.next() + continue + else: + new_args.append(arg) + if arg.type == token.NAME: + names_inserted.add(arg.value) + if new_args and new_args[-1].type == token.COMMA: + del new_args[-1] + if len(new_args) == 1: + atom = testlist.parent + new_args[0].prefix = atom.prefix + atom.replace(new_args[0]) + else: + args[:] = new_args + node.changed() diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_itertools.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_itertools.py new file mode 100644 index 000000000000..067641b8f86f --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_itertools.py @@ -0,0 +1,43 @@ +""" Fixer for itertools.(imap|ifilter|izip) --> (map|filter|zip) and + itertools.ifilterfalse --> itertools.filterfalse (bugs 2360-2363) + + imports from itertools are fixed in fix_itertools_import.py + + If itertools is imported as something else (ie: import itertools as it; + it.izip(spam, eggs)) method calls will not get fixed. + """ + +# Local imports +from .. import fixer_base +from ..fixer_util import Name + +class FixItertools(fixer_base.BaseFix): + BM_compatible = True + it_funcs = "('imap'|'ifilter'|'izip'|'izip_longest'|'ifilterfalse')" + PATTERN = """ + power< it='itertools' + trailer< + dot='.' func=%(it_funcs)s > trailer< '(' [any] ')' > > + | + power< func=%(it_funcs)s trailer< '(' [any] ')' > > + """ %(locals()) + + # Needs to be run after fix_(map|zip|filter) + run_order = 6 + + def transform(self, node, results): + prefix = None + func = results['func'][0] + if ('it' in results and + func.value not in (u'ifilterfalse', u'izip_longest')): + dot, it = (results['dot'], results['it']) + # Remove the 'itertools' + prefix = it.prefix + it.remove() + # Replace the node which contains ('.', 'function') with the + # function (to be consistent with the second part of the pattern) + dot.remove() + func.parent.replace(func) + + prefix = prefix or func.prefix + func.replace(Name(func.value[1:], prefix=prefix)) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_itertools_imports.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_itertools_imports.py new file mode 100644 index 000000000000..28610cfcb95c --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_itertools_imports.py @@ -0,0 +1,57 @@ +""" Fixer for imports of itertools.(imap|ifilter|izip|ifilterfalse) """ + +# Local imports +from lib2to3 import fixer_base +from lib2to3.fixer_util import BlankLine, syms, token + + +class FixItertoolsImports(fixer_base.BaseFix): + BM_compatible = True + PATTERN = """ + import_from< 'from' 'itertools' 'import' imports=any > + """ %(locals()) + + def transform(self, node, results): + imports = results['imports'] + if imports.type == syms.import_as_name or not imports.children: + children = [imports] + else: + children = imports.children + for child in children[::2]: + if child.type == token.NAME: + member = child.value + name_node = child + elif child.type == token.STAR: + # Just leave the import as is. + return + else: + assert child.type == syms.import_as_name + name_node = child.children[0] + member_name = name_node.value + if member_name in (u'imap', u'izip', u'ifilter'): + child.value = None + child.remove() + elif member_name in (u'ifilterfalse', u'izip_longest'): + node.changed() + name_node.value = (u'filterfalse' if member_name[1] == u'f' + else u'zip_longest') + + # Make sure the import statement is still sane + children = imports.children[:] or [imports] + remove_comma = True + for child in children: + if remove_comma and child.type == token.COMMA: + child.remove() + else: + remove_comma ^= True + + while children and children[-1].type == token.COMMA: + children.pop().remove() + + # If there are no imports left, just get rid of the entire statement + if (not (imports.children or getattr(imports, 'value', None)) or + imports.parent is None): + p = node.prefix + node = BlankLine() + node.prefix = p + return node diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_long.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_long.py new file mode 100644 index 000000000000..5dddde0d08d7 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_long.py @@ -0,0 +1,19 @@ +# Copyright 2006 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer that turns 'long' into 'int' everywhere. +""" + +# Local imports +from lib2to3 import fixer_base +from lib2to3.fixer_util import is_probably_builtin + + +class FixLong(fixer_base.BaseFix): + BM_compatible = True + PATTERN = "'long'" + + def transform(self, node, results): + if is_probably_builtin(node): + node.value = u"int" + node.changed() diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_map.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_map.py new file mode 100644 index 000000000000..7a7d0dbc66c0 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_map.py @@ -0,0 +1,91 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer that changes map(F, ...) into list(map(F, ...)) unless there +exists a 'from future_builtins import map' statement in the top-level +namespace. + +As a special case, map(None, X) is changed into list(X). (This is +necessary because the semantics are changed in this case -- the new +map(None, X) is equivalent to [(x,) for x in X].) + +We avoid the transformation (except for the special case mentioned +above) if the map() call is directly contained in iter(<>), list(<>), +tuple(<>), sorted(<>), ...join(<>), or for V in <>:. + +NOTE: This is still not correct if the original code was depending on +map(F, X, Y, ...) to go on until the longest argument is exhausted, +substituting None for missing values -- like zip(), it now stops as +soon as the shortest argument is exhausted. +""" + +# Local imports +from ..pgen2 import token +from .. import fixer_base +from ..fixer_util import Name, Call, ListComp, in_special_context +from ..pygram import python_symbols as syms + +class FixMap(fixer_base.ConditionalFix): + BM_compatible = True + + PATTERN = """ + map_none=power< + 'map' + trailer< '(' arglist< 'None' ',' arg=any [','] > ')' > + > + | + map_lambda=power< + 'map' + trailer< + '(' + arglist< + lambdef< 'lambda' + (fp=NAME | vfpdef< '(' fp=NAME ')'> ) ':' xp=any + > + ',' + it=any + > + ')' + > + > + | + power< + 'map' trailer< '(' [arglist=any] ')' > + > + """ + + skip_on = 'future_builtins.map' + + def transform(self, node, results): + if self.should_skip(node): + return + + if node.parent.type == syms.simple_stmt: + self.warning(node, "You should use a for loop here") + new = node.clone() + new.prefix = u"" + new = Call(Name(u"list"), [new]) + elif "map_lambda" in results: + new = ListComp(results["xp"].clone(), + results["fp"].clone(), + results["it"].clone()) + else: + if "map_none" in results: + new = results["arg"].clone() + else: + if "arglist" in results: + args = results["arglist"] + if args.type == syms.arglist and \ + args.children[0].type == token.NAME and \ + args.children[0].value == "None": + self.warning(node, "cannot convert map(None, ...) " + "with multiple arguments because map() " + "now truncates to the shortest sequence") + return + if in_special_context(node): + return None + new = node.clone() + new.prefix = u"" + new = Call(Name(u"list"), [new]) + new.prefix = node.prefix + return new diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_metaclass.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_metaclass.py new file mode 100644 index 000000000000..e0602ba3cc81 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_metaclass.py @@ -0,0 +1,228 @@ +"""Fixer for __metaclass__ = X -> (metaclass=X) methods. + + The various forms of classef (inherits nothing, inherits once, inherints + many) don't parse the same in the CST so we look at ALL classes for + a __metaclass__ and if we find one normalize the inherits to all be + an arglist. + + For one-liner classes ('class X: pass') there is no indent/dedent so + we normalize those into having a suite. + + Moving the __metaclass__ into the classdef can also cause the class + body to be empty so there is some special casing for that as well. + + This fixer also tries very hard to keep original indenting and spacing + in all those corner cases. + +""" +# Author: Jack Diederich + +# Local imports +from .. import fixer_base +from ..pygram import token +from ..fixer_util import syms, Node, Leaf + + +def has_metaclass(parent): + """ we have to check the cls_node without changing it. + There are two possiblities: + 1) clsdef => suite => simple_stmt => expr_stmt => Leaf('__meta') + 2) clsdef => simple_stmt => expr_stmt => Leaf('__meta') + """ + for node in parent.children: + if node.type == syms.suite: + return has_metaclass(node) + elif node.type == syms.simple_stmt and node.children: + expr_node = node.children[0] + if expr_node.type == syms.expr_stmt and expr_node.children: + left_side = expr_node.children[0] + if isinstance(left_side, Leaf) and \ + left_side.value == '__metaclass__': + return True + return False + + +def fixup_parse_tree(cls_node): + """ one-line classes don't get a suite in the parse tree so we add + one to normalize the tree + """ + for node in cls_node.children: + if node.type == syms.suite: + # already in the preferred format, do nothing + return + + # !%@#! oneliners have no suite node, we have to fake one up + for i, node in enumerate(cls_node.children): + if node.type == token.COLON: + break + else: + raise ValueError("No class suite and no ':'!") + + # move everything into a suite node + suite = Node(syms.suite, []) + while cls_node.children[i+1:]: + move_node = cls_node.children[i+1] + suite.append_child(move_node.clone()) + move_node.remove() + cls_node.append_child(suite) + node = suite + + +def fixup_simple_stmt(parent, i, stmt_node): + """ if there is a semi-colon all the parts count as part of the same + simple_stmt. We just want the __metaclass__ part so we move + everything after the semi-colon into its own simple_stmt node + """ + for semi_ind, node in enumerate(stmt_node.children): + if node.type == token.SEMI: # *sigh* + break + else: + return + + node.remove() # kill the semicolon + new_expr = Node(syms.expr_stmt, []) + new_stmt = Node(syms.simple_stmt, [new_expr]) + while stmt_node.children[semi_ind:]: + move_node = stmt_node.children[semi_ind] + new_expr.append_child(move_node.clone()) + move_node.remove() + parent.insert_child(i, new_stmt) + new_leaf1 = new_stmt.children[0].children[0] + old_leaf1 = stmt_node.children[0].children[0] + new_leaf1.prefix = old_leaf1.prefix + + +def remove_trailing_newline(node): + if node.children and node.children[-1].type == token.NEWLINE: + node.children[-1].remove() + + +def find_metas(cls_node): + # find the suite node (Mmm, sweet nodes) + for node in cls_node.children: + if node.type == syms.suite: + break + else: + raise ValueError("No class suite!") + + # look for simple_stmt[ expr_stmt[ Leaf('__metaclass__') ] ] + for i, simple_node in list(enumerate(node.children)): + if simple_node.type == syms.simple_stmt and simple_node.children: + expr_node = simple_node.children[0] + if expr_node.type == syms.expr_stmt and expr_node.children: + # Check if the expr_node is a simple assignment. + left_node = expr_node.children[0] + if isinstance(left_node, Leaf) and \ + left_node.value == u'__metaclass__': + # We found a assignment to __metaclass__. + fixup_simple_stmt(node, i, simple_node) + remove_trailing_newline(simple_node) + yield (node, i, simple_node) + + +def fixup_indent(suite): + """ If an INDENT is followed by a thing with a prefix then nuke the prefix + Otherwise we get in trouble when removing __metaclass__ at suite start + """ + kids = suite.children[::-1] + # find the first indent + while kids: + node = kids.pop() + if node.type == token.INDENT: + break + + # find the first Leaf + while kids: + node = kids.pop() + if isinstance(node, Leaf) and node.type != token.DEDENT: + if node.prefix: + node.prefix = u'' + return + else: + kids.extend(node.children[::-1]) + + +class FixMetaclass(fixer_base.BaseFix): + BM_compatible = True + + PATTERN = """ + classdef + """ + + def transform(self, node, results): + if not has_metaclass(node): + return + + fixup_parse_tree(node) + + # find metaclasses, keep the last one + last_metaclass = None + for suite, i, stmt in find_metas(node): + last_metaclass = stmt + stmt.remove() + + text_type = node.children[0].type # always Leaf(nnn, 'class') + + # figure out what kind of classdef we have + if len(node.children) == 7: + # Node(classdef, ['class', 'name', '(', arglist, ')', ':', suite]) + # 0 1 2 3 4 5 6 + if node.children[3].type == syms.arglist: + arglist = node.children[3] + # Node(classdef, ['class', 'name', '(', 'Parent', ')', ':', suite]) + else: + parent = node.children[3].clone() + arglist = Node(syms.arglist, [parent]) + node.set_child(3, arglist) + elif len(node.children) == 6: + # Node(classdef, ['class', 'name', '(', ')', ':', suite]) + # 0 1 2 3 4 5 + arglist = Node(syms.arglist, []) + node.insert_child(3, arglist) + elif len(node.children) == 4: + # Node(classdef, ['class', 'name', ':', suite]) + # 0 1 2 3 + arglist = Node(syms.arglist, []) + node.insert_child(2, Leaf(token.RPAR, u')')) + node.insert_child(2, arglist) + node.insert_child(2, Leaf(token.LPAR, u'(')) + else: + raise ValueError("Unexpected class definition") + + # now stick the metaclass in the arglist + meta_txt = last_metaclass.children[0].children[0] + meta_txt.value = 'metaclass' + orig_meta_prefix = meta_txt.prefix + + if arglist.children: + arglist.append_child(Leaf(token.COMMA, u',')) + meta_txt.prefix = u' ' + else: + meta_txt.prefix = u'' + + # compact the expression "metaclass = Meta" -> "metaclass=Meta" + expr_stmt = last_metaclass.children[0] + assert expr_stmt.type == syms.expr_stmt + expr_stmt.children[1].prefix = u'' + expr_stmt.children[2].prefix = u'' + + arglist.append_child(last_metaclass) + + fixup_indent(suite) + + # check for empty suite + if not suite.children: + # one-liner that was just __metaclass_ + suite.remove() + pass_leaf = Leaf(text_type, u'pass') + pass_leaf.prefix = orig_meta_prefix + node.append_child(pass_leaf) + node.append_child(Leaf(token.NEWLINE, u'\n')) + + elif len(suite.children) > 1 and \ + (suite.children[-2].type == token.INDENT and + suite.children[-1].type == token.DEDENT): + # there was only one line in the class body and it was __metaclass__ + pass_leaf = Leaf(text_type, u'pass') + suite.insert_child(-1, pass_leaf) + suite.insert_child(-1, Leaf(token.NEWLINE, u'\n')) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_methodattrs.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_methodattrs.py new file mode 100644 index 000000000000..f3c1ecfec153 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_methodattrs.py @@ -0,0 +1,24 @@ +"""Fix bound method attributes (method.im_? -> method.__?__). +""" +# Author: Christian Heimes + +# Local imports +from .. import fixer_base +from ..fixer_util import Name + +MAP = { + "im_func" : "__func__", + "im_self" : "__self__", + "im_class" : "__self__.__class__" + } + +class FixMethodattrs(fixer_base.BaseFix): + BM_compatible = True + PATTERN = """ + power< any+ trailer< '.' attr=('im_func' | 'im_self' | 'im_class') > any* > + """ + + def transform(self, node, results): + attr = results["attr"][0] + new = unicode(MAP[attr.value]) + attr.replace(Name(new, prefix=attr.prefix)) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_ne.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_ne.py new file mode 100644 index 000000000000..7025980b48e5 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_ne.py @@ -0,0 +1,23 @@ +# Copyright 2006 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer that turns <> into !=.""" + +# Local imports +from .. import pytree +from ..pgen2 import token +from .. import fixer_base + + +class FixNe(fixer_base.BaseFix): + # This is so simple that we don't need the pattern compiler. + + _accept_type = token.NOTEQUAL + + def match(self, node): + # Override + return node.value == u"<>" + + def transform(self, node, results): + new = pytree.Leaf(token.NOTEQUAL, u"!=", prefix=node.prefix) + return new diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_next.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_next.py new file mode 100644 index 000000000000..f021a9bd70a4 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_next.py @@ -0,0 +1,103 @@ +"""Fixer for it.next() -> next(it), per PEP 3114.""" +# Author: Collin Winter + +# Things that currently aren't covered: +# - listcomp "next" names aren't warned +# - "with" statement targets aren't checked + +# Local imports +from ..pgen2 import token +from ..pygram import python_symbols as syms +from .. import fixer_base +from ..fixer_util import Name, Call, find_binding + +bind_warning = "Calls to builtin next() possibly shadowed by global binding" + + +class FixNext(fixer_base.BaseFix): + BM_compatible = True + PATTERN = """ + power< base=any+ trailer< '.' attr='next' > trailer< '(' ')' > > + | + power< head=any+ trailer< '.' attr='next' > not trailer< '(' ')' > > + | + classdef< 'class' any+ ':' + suite< any* + funcdef< 'def' + name='next' + parameters< '(' NAME ')' > any+ > + any* > > + | + global=global_stmt< 'global' any* 'next' any* > + """ + + order = "pre" # Pre-order tree traversal + + def start_tree(self, tree, filename): + super(FixNext, self).start_tree(tree, filename) + + n = find_binding(u'next', tree) + if n: + self.warning(n, bind_warning) + self.shadowed_next = True + else: + self.shadowed_next = False + + def transform(self, node, results): + assert results + + base = results.get("base") + attr = results.get("attr") + name = results.get("name") + + if base: + if self.shadowed_next: + attr.replace(Name(u"__next__", prefix=attr.prefix)) + else: + base = [n.clone() for n in base] + base[0].prefix = u"" + node.replace(Call(Name(u"next", prefix=node.prefix), base)) + elif name: + n = Name(u"__next__", prefix=name.prefix) + name.replace(n) + elif attr: + # We don't do this transformation if we're assigning to "x.next". + # Unfortunately, it doesn't seem possible to do this in PATTERN, + # so it's being done here. + if is_assign_target(node): + head = results["head"] + if "".join([str(n) for n in head]).strip() == u'__builtin__': + self.warning(node, bind_warning) + return + attr.replace(Name(u"__next__")) + elif "global" in results: + self.warning(node, bind_warning) + self.shadowed_next = True + + +### The following functions help test if node is part of an assignment +### target. + +def is_assign_target(node): + assign = find_assign(node) + if assign is None: + return False + + for child in assign.children: + if child.type == token.EQUAL: + return False + elif is_subtree(child, node): + return True + return False + +def find_assign(node): + if node.type == syms.expr_stmt: + return node + if node.type == syms.simple_stmt or node.parent is None: + return None + return find_assign(node.parent) + +def is_subtree(root, node): + if root == node: + return True + return any(is_subtree(c, node) for c in root.children) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_nonzero.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_nonzero.py new file mode 100644 index 000000000000..2caf27928fea --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_nonzero.py @@ -0,0 +1,21 @@ +"""Fixer for __nonzero__ -> __bool__ methods.""" +# Author: Collin Winter + +# Local imports +from .. import fixer_base +from ..fixer_util import Name + +class FixNonzero(fixer_base.BaseFix): + BM_compatible = True + PATTERN = """ + classdef< 'class' any+ ':' + suite< any* + funcdef< 'def' name='__nonzero__' + parameters< '(' NAME ')' > any+ > + any* > > + """ + + def transform(self, node, results): + name = results["name"] + new = Name(u"__bool__", prefix=name.prefix) + name.replace(new) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_numliterals.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_numliterals.py new file mode 100644 index 000000000000..b0c23f8041ad --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_numliterals.py @@ -0,0 +1,28 @@ +"""Fixer that turns 1L into 1, 0755 into 0o755. +""" +# Copyright 2007 Georg Brandl. +# Licensed to PSF under a Contributor Agreement. + +# Local imports +from ..pgen2 import token +from .. import fixer_base +from ..fixer_util import Number + + +class FixNumliterals(fixer_base.BaseFix): + # This is so simple that we don't need the pattern compiler. + + _accept_type = token.NUMBER + + def match(self, node): + # Override + return (node.value.startswith(u"0") or node.value[-1] in u"Ll") + + def transform(self, node, results): + val = node.value + if val[-1] in u'Ll': + val = val[:-1] + elif val.startswith(u'0') and val.isdigit() and len(set(val)) > 1: + val = u"0o" + val[1:] + + return Number(val, prefix=node.prefix) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_operator.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_operator.py new file mode 100644 index 000000000000..7bf2c0dd22c6 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_operator.py @@ -0,0 +1,96 @@ +"""Fixer for operator functions. + +operator.isCallable(obj) -> hasattr(obj, '__call__') +operator.sequenceIncludes(obj) -> operator.contains(obj) +operator.isSequenceType(obj) -> isinstance(obj, collections.Sequence) +operator.isMappingType(obj) -> isinstance(obj, collections.Mapping) +operator.isNumberType(obj) -> isinstance(obj, numbers.Number) +operator.repeat(obj, n) -> operator.mul(obj, n) +operator.irepeat(obj, n) -> operator.imul(obj, n) +""" + +# Local imports +from lib2to3 import fixer_base +from lib2to3.fixer_util import Call, Name, String, touch_import + + +def invocation(s): + def dec(f): + f.invocation = s + return f + return dec + + +class FixOperator(fixer_base.BaseFix): + BM_compatible = True + order = "pre" + + methods = """ + method=('isCallable'|'sequenceIncludes' + |'isSequenceType'|'isMappingType'|'isNumberType' + |'repeat'|'irepeat') + """ + obj = "'(' obj=any ')'" + PATTERN = """ + power< module='operator' + trailer< '.' %(methods)s > trailer< %(obj)s > > + | + power< %(methods)s trailer< %(obj)s > > + """ % dict(methods=methods, obj=obj) + + def transform(self, node, results): + method = self._check_method(node, results) + if method is not None: + return method(node, results) + + @invocation("operator.contains(%s)") + def _sequenceIncludes(self, node, results): + return self._handle_rename(node, results, u"contains") + + @invocation("hasattr(%s, '__call__')") + def _isCallable(self, node, results): + obj = results["obj"] + args = [obj.clone(), String(u", "), String(u"'__call__'")] + return Call(Name(u"hasattr"), args, prefix=node.prefix) + + @invocation("operator.mul(%s)") + def _repeat(self, node, results): + return self._handle_rename(node, results, u"mul") + + @invocation("operator.imul(%s)") + def _irepeat(self, node, results): + return self._handle_rename(node, results, u"imul") + + @invocation("isinstance(%s, collections.Sequence)") + def _isSequenceType(self, node, results): + return self._handle_type2abc(node, results, u"collections", u"Sequence") + + @invocation("isinstance(%s, collections.Mapping)") + def _isMappingType(self, node, results): + return self._handle_type2abc(node, results, u"collections", u"Mapping") + + @invocation("isinstance(%s, numbers.Number)") + def _isNumberType(self, node, results): + return self._handle_type2abc(node, results, u"numbers", u"Number") + + def _handle_rename(self, node, results, name): + method = results["method"][0] + method.value = name + method.changed() + + def _handle_type2abc(self, node, results, module, abc): + touch_import(None, module, node) + obj = results["obj"] + args = [obj.clone(), String(u", " + u".".join([module, abc]))] + return Call(Name(u"isinstance"), args, prefix=node.prefix) + + def _check_method(self, node, results): + method = getattr(self, "_" + results["method"][0].value.encode("ascii")) + if callable(method): + if "module" in results: + return method + else: + sub = (unicode(results["obj"]),) + invocation_str = unicode(method.invocation) % sub + self.warning(node, u"You should use '%s' here." % invocation_str) + return None diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_paren.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_paren.py new file mode 100644 index 000000000000..8650cd9078af --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_paren.py @@ -0,0 +1,44 @@ +"""Fixer that addes parentheses where they are required + +This converts ``[x for x in 1, 2]`` to ``[x for x in (1, 2)]``.""" + +# By Taek Joo Kim and Benjamin Peterson + +# Local imports +from .. import fixer_base +from ..fixer_util import LParen, RParen + +# XXX This doesn't support nested for loops like [x for x in 1, 2 for x in 1, 2] +class FixParen(fixer_base.BaseFix): + BM_compatible = True + + PATTERN = """ + atom< ('[' | '(') + (listmaker< any + comp_for< + 'for' NAME 'in' + target=testlist_safe< any (',' any)+ [','] + > + [any] + > + > + | + testlist_gexp< any + comp_for< + 'for' NAME 'in' + target=testlist_safe< any (',' any)+ [','] + > + [any] + > + >) + (']' | ')') > + """ + + def transform(self, node, results): + target = results["target"] + + lparen = LParen() + lparen.prefix = target.prefix + target.prefix = u"" # Make it hug the parentheses + target.insert_child(0, lparen) + target.append_child(RParen()) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_print.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_print.py new file mode 100644 index 000000000000..5016917876cb --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_print.py @@ -0,0 +1,87 @@ +# Copyright 2006 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer for print. + +Change: + 'print' into 'print()' + 'print ...' into 'print(...)' + 'print ... ,' into 'print(..., end=" ")' + 'print >>x, ...' into 'print(..., file=x)' + +No changes are applied if print_function is imported from __future__ + +""" + +# Local imports +from .. import patcomp +from .. import pytree +from ..pgen2 import token +from .. import fixer_base +from ..fixer_util import Name, Call, Comma, String + + +parend_expr = patcomp.compile_pattern( + """atom< '(' [atom|STRING|NAME] ')' >""" + ) + + +class FixPrint(fixer_base.BaseFix): + + BM_compatible = True + + PATTERN = """ + simple_stmt< any* bare='print' any* > | print_stmt + """ + + def transform(self, node, results): + assert results + + bare_print = results.get("bare") + + if bare_print: + # Special-case print all by itself + bare_print.replace(Call(Name(u"print"), [], + prefix=bare_print.prefix)) + return + assert node.children[0] == Name(u"print") + args = node.children[1:] + if len(args) == 1 and parend_expr.match(args[0]): + # We don't want to keep sticking parens around an + # already-parenthesised expression. + return + + sep = end = file = None + if args and args[-1] == Comma(): + args = args[:-1] + end = " " + if args and args[0] == pytree.Leaf(token.RIGHTSHIFT, u">>"): + assert len(args) >= 2 + file = args[1].clone() + args = args[3:] # Strip a possible comma after the file expression + # Now synthesize a print(args, sep=..., end=..., file=...) node. + l_args = [arg.clone() for arg in args] + if l_args: + l_args[0].prefix = u"" + if sep is not None or end is not None or file is not None: + if sep is not None: + self.add_kwarg(l_args, u"sep", String(repr(sep))) + if end is not None: + self.add_kwarg(l_args, u"end", String(repr(end))) + if file is not None: + self.add_kwarg(l_args, u"file", file) + n_stmt = Call(Name(u"print"), l_args) + n_stmt.prefix = node.prefix + return n_stmt + + def add_kwarg(self, l_nodes, s_kwd, n_expr): + # XXX All this prefix-setting may lose comments (though rarely) + n_expr.prefix = u"" + n_argument = pytree.Node(self.syms.argument, + (Name(s_kwd), + pytree.Leaf(token.EQUAL, u"="), + n_expr)) + if l_nodes: + l_nodes.append(Comma()) + n_argument.prefix = u" " + l_nodes.append(n_argument) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_raise.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_raise.py new file mode 100644 index 000000000000..b958ba0129de --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_raise.py @@ -0,0 +1,90 @@ +"""Fixer for 'raise E, V, T' + +raise -> raise +raise E -> raise E +raise E, V -> raise E(V) +raise E, V, T -> raise E(V).with_traceback(T) +raise E, None, T -> raise E.with_traceback(T) + +raise (((E, E'), E''), E'''), V -> raise E(V) +raise "foo", V, T -> warns about string exceptions + + +CAVEATS: +1) "raise E, V" will be incorrectly translated if V is an exception + instance. The correct Python 3 idiom is + + raise E from V + + but since we can't detect instance-hood by syntax alone and since + any client code would have to be changed as well, we don't automate + this. +""" +# Author: Collin Winter + +# Local imports +from .. import pytree +from ..pgen2 import token +from .. import fixer_base +from ..fixer_util import Name, Call, Attr, ArgList, is_tuple + +class FixRaise(fixer_base.BaseFix): + + BM_compatible = True + PATTERN = """ + raise_stmt< 'raise' exc=any [',' val=any [',' tb=any]] > + """ + + def transform(self, node, results): + syms = self.syms + + exc = results["exc"].clone() + if exc.type == token.STRING: + msg = "Python 3 does not support string exceptions" + self.cannot_convert(node, msg) + return + + # Python 2 supports + # raise ((((E1, E2), E3), E4), E5), V + # as a synonym for + # raise E1, V + # Since Python 3 will not support this, we recurse down any tuple + # literals, always taking the first element. + if is_tuple(exc): + while is_tuple(exc): + # exc.children[1:-1] is the unparenthesized tuple + # exc.children[1].children[0] is the first element of the tuple + exc = exc.children[1].children[0].clone() + exc.prefix = u" " + + if "val" not in results: + # One-argument raise + new = pytree.Node(syms.raise_stmt, [Name(u"raise"), exc]) + new.prefix = node.prefix + return new + + val = results["val"].clone() + if is_tuple(val): + args = [c.clone() for c in val.children[1:-1]] + else: + val.prefix = u"" + args = [val] + + if "tb" in results: + tb = results["tb"].clone() + tb.prefix = u"" + + e = exc + # If there's a traceback and None is passed as the value, then don't + # add a call, since the user probably just wants to add a + # traceback. See issue #9661. + if val.type != token.NAME or val.value != u"None": + e = Call(exc, args) + with_tb = Attr(e, Name(u'with_traceback')) + [ArgList([tb])] + new = pytree.Node(syms.simple_stmt, [Name(u"raise")] + with_tb) + new.prefix = node.prefix + return new + else: + return pytree.Node(syms.raise_stmt, + [Name(u"raise"), Call(exc, args)], + prefix=node.prefix) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_raw_input.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_raw_input.py new file mode 100644 index 000000000000..3a73b81864e2 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_raw_input.py @@ -0,0 +1,17 @@ +"""Fixer that changes raw_input(...) into input(...).""" +# Author: Andre Roberge + +# Local imports +from .. import fixer_base +from ..fixer_util import Name + +class FixRawInput(fixer_base.BaseFix): + + BM_compatible = True + PATTERN = """ + power< name='raw_input' trailer< '(' [any] ')' > any* > + """ + + def transform(self, node, results): + name = results["name"] + name.replace(Name(u"input", prefix=name.prefix)) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_reduce.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_reduce.py new file mode 100644 index 000000000000..6bd785c1cd90 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_reduce.py @@ -0,0 +1,35 @@ +# Copyright 2008 Armin Ronacher. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer for reduce(). + +Makes sure reduce() is imported from the functools module if reduce is +used in that module. +""" + +from lib2to3 import fixer_base +from lib2to3.fixer_util import touch_import + + + +class FixReduce(fixer_base.BaseFix): + + BM_compatible = True + order = "pre" + + PATTERN = """ + power< 'reduce' + trailer< '(' + arglist< ( + (not(argument) any ',' + not(argument + > + """ + + def transform(self, node, results): + touch_import(u'functools', u'reduce', node) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_renames.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_renames.py new file mode 100644 index 000000000000..4bcce8c4ebdd --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_renames.py @@ -0,0 +1,70 @@ +"""Fix incompatible renames + +Fixes: + * sys.maxint -> sys.maxsize +""" +# Author: Christian Heimes +# based on Collin Winter's fix_import + +# Local imports +from .. import fixer_base +from ..fixer_util import Name, attr_chain + +MAPPING = {"sys": {"maxint" : "maxsize"}, + } +LOOKUP = {} + +def alternates(members): + return "(" + "|".join(map(repr, members)) + ")" + + +def build_pattern(): + #bare = set() + for module, replace in MAPPING.items(): + for old_attr, new_attr in replace.items(): + LOOKUP[(module, old_attr)] = new_attr + #bare.add(module) + #bare.add(old_attr) + #yield """ + # import_name< 'import' (module=%r + # | dotted_as_names< any* module=%r any* >) > + # """ % (module, module) + yield """ + import_from< 'from' module_name=%r 'import' + ( attr_name=%r | import_as_name< attr_name=%r 'as' any >) > + """ % (module, old_attr, old_attr) + yield """ + power< module_name=%r trailer< '.' attr_name=%r > any* > + """ % (module, old_attr) + #yield """bare_name=%s""" % alternates(bare) + + +class FixRenames(fixer_base.BaseFix): + BM_compatible = True + PATTERN = "|".join(build_pattern()) + + order = "pre" # Pre-order tree traversal + + # Don't match the node if it's within another match + def match(self, node): + match = super(FixRenames, self).match + results = match(node) + if results: + if any(match(obj) for obj in attr_chain(node, "parent")): + return False + return results + return False + + #def start_tree(self, tree, filename): + # super(FixRenames, self).start_tree(tree, filename) + # self.replace = {} + + def transform(self, node, results): + mod_name = results.get("module_name") + attr_name = results.get("attr_name") + #bare_name = results.get("bare_name") + #import_mod = results.get("module") + + if mod_name and attr_name: + new_attr = unicode(LOOKUP[(mod_name.value, attr_name.value)]) + attr_name.replace(Name(new_attr, prefix=attr_name.prefix)) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_repr.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_repr.py new file mode 100644 index 000000000000..f34365647f0b --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_repr.py @@ -0,0 +1,23 @@ +# Copyright 2006 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer that transforms `xyzzy` into repr(xyzzy).""" + +# Local imports +from .. import fixer_base +from ..fixer_util import Call, Name, parenthesize + + +class FixRepr(fixer_base.BaseFix): + + BM_compatible = True + PATTERN = """ + atom < '`' expr=any '`' > + """ + + def transform(self, node, results): + expr = results["expr"].clone() + + if expr.type == self.syms.testlist1: + expr = parenthesize(expr) + return Call(Name(u"repr"), [expr], prefix=node.prefix) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_set_literal.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_set_literal.py new file mode 100644 index 000000000000..d3d38ec4e0ab --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_set_literal.py @@ -0,0 +1,53 @@ +""" +Optional fixer to transform set() calls to set literals. +""" + +# Author: Benjamin Peterson + +from lib2to3 import fixer_base, pytree +from lib2to3.fixer_util import token, syms + + + +class FixSetLiteral(fixer_base.BaseFix): + + BM_compatible = True + explicit = True + + PATTERN = """power< 'set' trailer< '(' + (atom=atom< '[' (items=listmaker< any ((',' any)* [',']) > + | + single=any) ']' > + | + atom< '(' items=testlist_gexp< any ((',' any)* [',']) > ')' > + ) + ')' > > + """ + + def transform(self, node, results): + single = results.get("single") + if single: + # Make a fake listmaker + fake = pytree.Node(syms.listmaker, [single.clone()]) + single.replace(fake) + items = fake + else: + items = results["items"] + + # Build the contents of the literal + literal = [pytree.Leaf(token.LBRACE, u"{")] + literal.extend(n.clone() for n in items.children) + literal.append(pytree.Leaf(token.RBRACE, u"}")) + # Set the prefix of the right brace to that of the ')' or ']' + literal[-1].prefix = items.next_sibling.prefix + maker = pytree.Node(syms.dictsetmaker, literal) + maker.prefix = node.prefix + + # If the original was a one tuple, we need to remove the extra comma. + if len(maker.children) == 4: + n = maker.children[2] + n.remove() + maker.children[-1].prefix = n.prefix + + # Finally, replace the set call with our shiny new literal. + return maker diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_standarderror.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_standarderror.py new file mode 100644 index 000000000000..6cad51116d03 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_standarderror.py @@ -0,0 +1,18 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer for StandardError -> Exception.""" + +# Local imports +from .. import fixer_base +from ..fixer_util import Name + + +class FixStandarderror(fixer_base.BaseFix): + BM_compatible = True + PATTERN = """ + 'StandardError' + """ + + def transform(self, node, results): + return Name(u"Exception", prefix=node.prefix) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_sys_exc.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_sys_exc.py new file mode 100644 index 000000000000..2ecca2b53543 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_sys_exc.py @@ -0,0 +1,30 @@ +"""Fixer for sys.exc_{type, value, traceback} + +sys.exc_type -> sys.exc_info()[0] +sys.exc_value -> sys.exc_info()[1] +sys.exc_traceback -> sys.exc_info()[2] +""" + +# By Jeff Balogh and Benjamin Peterson + +# Local imports +from .. import fixer_base +from ..fixer_util import Attr, Call, Name, Number, Subscript, Node, syms + +class FixSysExc(fixer_base.BaseFix): + # This order matches the ordering of sys.exc_info(). + exc_info = [u"exc_type", u"exc_value", u"exc_traceback"] + BM_compatible = True + PATTERN = """ + power< 'sys' trailer< dot='.' attribute=(%s) > > + """ % '|'.join("'%s'" % e for e in exc_info) + + def transform(self, node, results): + sys_attr = results["attribute"][0] + index = Number(self.exc_info.index(sys_attr.value)) + + call = Call(Name(u"exc_info"), prefix=sys_attr.prefix) + attr = Attr(Name(u"sys"), call) + attr[1].children[0].prefix = results["dot"].prefix + attr.append(Subscript(index)) + return Node(syms.power, attr, prefix=node.prefix) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_throw.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_throw.py new file mode 100644 index 000000000000..1468d89a4506 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_throw.py @@ -0,0 +1,56 @@ +"""Fixer for generator.throw(E, V, T). + +g.throw(E) -> g.throw(E) +g.throw(E, V) -> g.throw(E(V)) +g.throw(E, V, T) -> g.throw(E(V).with_traceback(T)) + +g.throw("foo"[, V[, T]]) will warn about string exceptions.""" +# Author: Collin Winter + +# Local imports +from .. import pytree +from ..pgen2 import token +from .. import fixer_base +from ..fixer_util import Name, Call, ArgList, Attr, is_tuple + +class FixThrow(fixer_base.BaseFix): + BM_compatible = True + PATTERN = """ + power< any trailer< '.' 'throw' > + trailer< '(' args=arglist< exc=any ',' val=any [',' tb=any] > ')' > + > + | + power< any trailer< '.' 'throw' > trailer< '(' exc=any ')' > > + """ + + def transform(self, node, results): + syms = self.syms + + exc = results["exc"].clone() + if exc.type is token.STRING: + self.cannot_convert(node, "Python 3 does not support string exceptions") + return + + # Leave "g.throw(E)" alone + val = results.get(u"val") + if val is None: + return + + val = val.clone() + if is_tuple(val): + args = [c.clone() for c in val.children[1:-1]] + else: + val.prefix = u"" + args = [val] + + throw_args = results["args"] + + if "tb" in results: + tb = results["tb"].clone() + tb.prefix = u"" + + e = Call(exc, args) + with_tb = Attr(e, Name(u'with_traceback')) + [ArgList([tb])] + throw_args.replace(pytree.Node(syms.power, with_tb)) + else: + throw_args.replace(Call(exc, args)) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_tuple_params.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_tuple_params.py new file mode 100644 index 000000000000..6361717dc54d --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_tuple_params.py @@ -0,0 +1,175 @@ +"""Fixer for function definitions with tuple parameters. + +def func(((a, b), c), d): + ... + + -> + +def func(x, d): + ((a, b), c) = x + ... + +It will also support lambdas: + + lambda (x, y): x + y -> lambda t: t[0] + t[1] + + # The parens are a syntax error in Python 3 + lambda (x): x + y -> lambda x: x + y +""" +# Author: Collin Winter + +# Local imports +from .. import pytree +from ..pgen2 import token +from .. import fixer_base +from ..fixer_util import Assign, Name, Newline, Number, Subscript, syms + +def is_docstring(stmt): + return isinstance(stmt, pytree.Node) and \ + stmt.children[0].type == token.STRING + +class FixTupleParams(fixer_base.BaseFix): + run_order = 4 #use a lower order since lambda is part of other + #patterns + BM_compatible = True + + PATTERN = """ + funcdef< 'def' any parameters< '(' args=any ')' > + ['->' any] ':' suite=any+ > + | + lambda= + lambdef< 'lambda' args=vfpdef< '(' inner=any ')' > + ':' body=any + > + """ + + def transform(self, node, results): + if "lambda" in results: + return self.transform_lambda(node, results) + + new_lines = [] + suite = results["suite"] + args = results["args"] + # This crap is so "def foo(...): x = 5; y = 7" is handled correctly. + # TODO(cwinter): suite-cleanup + if suite[0].children[1].type == token.INDENT: + start = 2 + indent = suite[0].children[1].value + end = Newline() + else: + start = 0 + indent = u"; " + end = pytree.Leaf(token.INDENT, u"") + + # We need access to self for new_name(), and making this a method + # doesn't feel right. Closing over self and new_lines makes the + # code below cleaner. + def handle_tuple(tuple_arg, add_prefix=False): + n = Name(self.new_name()) + arg = tuple_arg.clone() + arg.prefix = u"" + stmt = Assign(arg, n.clone()) + if add_prefix: + n.prefix = u" " + tuple_arg.replace(n) + new_lines.append(pytree.Node(syms.simple_stmt, + [stmt, end.clone()])) + + if args.type == syms.tfpdef: + handle_tuple(args) + elif args.type == syms.typedargslist: + for i, arg in enumerate(args.children): + if arg.type == syms.tfpdef: + # Without add_prefix, the emitted code is correct, + # just ugly. + handle_tuple(arg, add_prefix=(i > 0)) + + if not new_lines: + return + + # This isn't strictly necessary, but it plays nicely with other fixers. + # TODO(cwinter) get rid of this when children becomes a smart list + for line in new_lines: + line.parent = suite[0] + + # TODO(cwinter) suite-cleanup + after = start + if start == 0: + new_lines[0].prefix = u" " + elif is_docstring(suite[0].children[start]): + new_lines[0].prefix = indent + after = start + 1 + + for line in new_lines: + line.parent = suite[0] + suite[0].children[after:after] = new_lines + for i in range(after+1, after+len(new_lines)+1): + suite[0].children[i].prefix = indent + suite[0].changed() + + def transform_lambda(self, node, results): + args = results["args"] + body = results["body"] + inner = simplify_args(results["inner"]) + + # Replace lambda ((((x)))): x with lambda x: x + if inner.type == token.NAME: + inner = inner.clone() + inner.prefix = u" " + args.replace(inner) + return + + params = find_params(args) + to_index = map_to_index(params) + tup_name = self.new_name(tuple_name(params)) + + new_param = Name(tup_name, prefix=u" ") + args.replace(new_param.clone()) + for n in body.post_order(): + if n.type == token.NAME and n.value in to_index: + subscripts = [c.clone() for c in to_index[n.value]] + new = pytree.Node(syms.power, + [new_param.clone()] + subscripts) + new.prefix = n.prefix + n.replace(new) + + +### Helper functions for transform_lambda() + +def simplify_args(node): + if node.type in (syms.vfplist, token.NAME): + return node + elif node.type == syms.vfpdef: + # These look like vfpdef< '(' x ')' > where x is NAME + # or another vfpdef instance (leading to recursion). + while node.type == syms.vfpdef: + node = node.children[1] + return node + raise RuntimeError("Received unexpected node %s" % node) + +def find_params(node): + if node.type == syms.vfpdef: + return find_params(node.children[1]) + elif node.type == token.NAME: + return node.value + return [find_params(c) for c in node.children if c.type != token.COMMA] + +def map_to_index(param_list, prefix=[], d=None): + if d is None: + d = {} + for i, obj in enumerate(param_list): + trailer = [Subscript(Number(unicode(i)))] + if isinstance(obj, list): + map_to_index(obj, trailer, d=d) + else: + d[obj] = prefix + trailer + return d + +def tuple_name(param_list): + l = [] + for obj in param_list: + if isinstance(obj, list): + l.append(tuple_name(obj)) + else: + l.append(obj) + return u"_".join(l) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_types.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_types.py new file mode 100644 index 000000000000..696c82587d29 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_types.py @@ -0,0 +1,61 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer for removing uses of the types module. + +These work for only the known names in the types module. The forms above +can include types. or not. ie, It is assumed the module is imported either as: + + import types + from types import ... # either * or specific types + +The import statements are not modified. + +There should be another fixer that handles at least the following constants: + + type([]) -> list + type(()) -> tuple + type('') -> str + +""" + +# Local imports +from .. import fixer_base +from ..fixer_util import Name + +_TYPE_MAPPING = { + 'BooleanType' : 'bool', + 'BufferType' : 'memoryview', + 'ClassType' : 'type', + 'ComplexType' : 'complex', + 'DictType': 'dict', + 'DictionaryType' : 'dict', + 'EllipsisType' : 'type(Ellipsis)', + #'FileType' : 'io.IOBase', + 'FloatType': 'float', + 'IntType': 'int', + 'ListType': 'list', + 'LongType': 'int', + 'ObjectType' : 'object', + 'NoneType': 'type(None)', + 'NotImplementedType' : 'type(NotImplemented)', + 'SliceType' : 'slice', + 'StringType': 'bytes', # XXX ? + 'StringTypes' : 'str', # XXX ? + 'TupleType': 'tuple', + 'TypeType' : 'type', + 'UnicodeType': 'str', + 'XRangeType' : 'range', + } + +_pats = ["power< 'types' trailer< '.' name='%s' > >" % t for t in _TYPE_MAPPING] + +class FixTypes(fixer_base.BaseFix): + BM_compatible = True + PATTERN = '|'.join(_pats) + + def transform(self, node, results): + new_value = unicode(_TYPE_MAPPING.get(results["name"].value)) + if new_value: + return Name(new_value, prefix=node.prefix) + return None diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_unicode.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_unicode.py new file mode 100644 index 000000000000..2d776f61051e --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_unicode.py @@ -0,0 +1,42 @@ +r"""Fixer for unicode. + +* Changes unicode to str and unichr to chr. + +* If "...\u..." is not unicode literal change it into "...\\u...". + +* Change u"..." into "...". + +""" + +from ..pgen2 import token +from .. import fixer_base + +_mapping = {u"unichr" : u"chr", u"unicode" : u"str"} + +class FixUnicode(fixer_base.BaseFix): + BM_compatible = True + PATTERN = "STRING | 'unicode' | 'unichr'" + + def start_tree(self, tree, filename): + super(FixUnicode, self).start_tree(tree, filename) + self.unicode_literals = 'unicode_literals' in tree.future_features + + def transform(self, node, results): + if node.type == token.NAME: + new = node.clone() + new.value = _mapping[node.value] + return new + elif node.type == token.STRING: + val = node.value + if not self.unicode_literals and val[0] in u'\'"' and u'\\' in val: + val = ur'\\'.join([ + v.replace(u'\\u', ur'\\u').replace(u'\\U', ur'\\U') + for v in val.split(ur'\\') + ]) + if val[0] in u'uU': + val = val[1:] + if val == node.value: + return node + new = node.clone() + new.value = val + return new diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_urllib.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_urllib.py new file mode 100644 index 000000000000..e7ff34d0f3e2 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_urllib.py @@ -0,0 +1,196 @@ +"""Fix changes imports of urllib which are now incompatible. + This is rather similar to fix_imports, but because of the more + complex nature of the fixing for urllib, it has its own fixer. +""" +# Author: Nick Edds + +# Local imports +from lib2to3.fixes.fix_imports import alternates, FixImports +from lib2to3.fixer_util import (Name, Comma, FromImport, Newline, + find_indentation, Node, syms) + +MAPPING = {"urllib": [ + ("urllib.request", + ["URLopener", "FancyURLopener", "urlretrieve", + "_urlopener", "urlopen", "urlcleanup", + "pathname2url", "url2pathname"]), + ("urllib.parse", + ["quote", "quote_plus", "unquote", "unquote_plus", + "urlencode", "splitattr", "splithost", "splitnport", + "splitpasswd", "splitport", "splitquery", "splittag", + "splittype", "splituser", "splitvalue", ]), + ("urllib.error", + ["ContentTooShortError"])], + "urllib2" : [ + ("urllib.request", + ["urlopen", "install_opener", "build_opener", + "Request", "OpenerDirector", "BaseHandler", + "HTTPDefaultErrorHandler", "HTTPRedirectHandler", + "HTTPCookieProcessor", "ProxyHandler", + "HTTPPasswordMgr", + "HTTPPasswordMgrWithDefaultRealm", + "AbstractBasicAuthHandler", + "HTTPBasicAuthHandler", "ProxyBasicAuthHandler", + "AbstractDigestAuthHandler", + "HTTPDigestAuthHandler", "ProxyDigestAuthHandler", + "HTTPHandler", "HTTPSHandler", "FileHandler", + "FTPHandler", "CacheFTPHandler", + "UnknownHandler"]), + ("urllib.error", + ["URLError", "HTTPError"]), + ] +} + +# Duplicate the url parsing functions for urllib2. +MAPPING["urllib2"].append(MAPPING["urllib"][1]) + + +def build_pattern(): + bare = set() + for old_module, changes in MAPPING.items(): + for change in changes: + new_module, members = change + members = alternates(members) + yield """import_name< 'import' (module=%r + | dotted_as_names< any* module=%r any* >) > + """ % (old_module, old_module) + yield """import_from< 'from' mod_member=%r 'import' + ( member=%s | import_as_name< member=%s 'as' any > | + import_as_names< members=any* >) > + """ % (old_module, members, members) + yield """import_from< 'from' module_star=%r 'import' star='*' > + """ % old_module + yield """import_name< 'import' + dotted_as_name< module_as=%r 'as' any > > + """ % old_module + # bare_with_attr has a special significance for FixImports.match(). + yield """power< bare_with_attr=%r trailer< '.' member=%s > any* > + """ % (old_module, members) + + +class FixUrllib(FixImports): + + def build_pattern(self): + return "|".join(build_pattern()) + + def transform_import(self, node, results): + """Transform for the basic import case. Replaces the old + import name with a comma separated list of its + replacements. + """ + import_mod = results.get("module") + pref = import_mod.prefix + + names = [] + + # create a Node list of the replacement modules + for name in MAPPING[import_mod.value][:-1]: + names.extend([Name(name[0], prefix=pref), Comma()]) + names.append(Name(MAPPING[import_mod.value][-1][0], prefix=pref)) + import_mod.replace(names) + + def transform_member(self, node, results): + """Transform for imports of specific module elements. Replaces + the module to be imported from with the appropriate new + module. + """ + mod_member = results.get("mod_member") + pref = mod_member.prefix + member = results.get("member") + + # Simple case with only a single member being imported + if member: + # this may be a list of length one, or just a node + if isinstance(member, list): + member = member[0] + new_name = None + for change in MAPPING[mod_member.value]: + if member.value in change[1]: + new_name = change[0] + break + if new_name: + mod_member.replace(Name(new_name, prefix=pref)) + else: + self.cannot_convert(node, "This is an invalid module element") + + # Multiple members being imported + else: + # a dictionary for replacements, order matters + modules = [] + mod_dict = {} + members = results["members"] + for member in members: + # we only care about the actual members + if member.type == syms.import_as_name: + as_name = member.children[2].value + member_name = member.children[0].value + else: + member_name = member.value + as_name = None + if member_name != u",": + for change in MAPPING[mod_member.value]: + if member_name in change[1]: + if change[0] not in mod_dict: + modules.append(change[0]) + mod_dict.setdefault(change[0], []).append(member) + + new_nodes = [] + indentation = find_indentation(node) + first = True + def handle_name(name, prefix): + if name.type == syms.import_as_name: + kids = [Name(name.children[0].value, prefix=prefix), + name.children[1].clone(), + name.children[2].clone()] + return [Node(syms.import_as_name, kids)] + return [Name(name.value, prefix=prefix)] + for module in modules: + elts = mod_dict[module] + names = [] + for elt in elts[:-1]: + names.extend(handle_name(elt, pref)) + names.append(Comma()) + names.extend(handle_name(elts[-1], pref)) + new = FromImport(module, names) + if not first or node.parent.prefix.endswith(indentation): + new.prefix = indentation + new_nodes.append(new) + first = False + if new_nodes: + nodes = [] + for new_node in new_nodes[:-1]: + nodes.extend([new_node, Newline()]) + nodes.append(new_nodes[-1]) + node.replace(nodes) + else: + self.cannot_convert(node, "All module elements are invalid") + + def transform_dot(self, node, results): + """Transform for calls to module members in code.""" + module_dot = results.get("bare_with_attr") + member = results.get("member") + new_name = None + if isinstance(member, list): + member = member[0] + for change in MAPPING[module_dot.value]: + if member.value in change[1]: + new_name = change[0] + break + if new_name: + module_dot.replace(Name(new_name, + prefix=module_dot.prefix)) + else: + self.cannot_convert(node, "This is an invalid module element") + + def transform(self, node, results): + if results.get("module"): + self.transform_import(node, results) + elif results.get("mod_member"): + self.transform_member(node, results) + elif results.get("bare_with_attr"): + self.transform_dot(node, results) + # Renaming and star imports are not supported for these modules. + elif results.get("module_star"): + self.cannot_convert(node, "Cannot handle star imports.") + elif results.get("module_as"): + self.cannot_convert(node, "This module is now multiple modules") diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_ws_comma.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_ws_comma.py new file mode 100644 index 000000000000..37ff6244a937 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_ws_comma.py @@ -0,0 +1,39 @@ +"""Fixer that changes 'a ,b' into 'a, b'. + +This also changes '{a :b}' into '{a: b}', but does not touch other +uses of colons. It does not touch other uses of whitespace. + +""" + +from .. import pytree +from ..pgen2 import token +from .. import fixer_base + +class FixWsComma(fixer_base.BaseFix): + + explicit = True # The user must ask for this fixers + + PATTERN = """ + any<(not(',') any)+ ',' ((not(',') any)+ ',')* [not(',') any]> + """ + + COMMA = pytree.Leaf(token.COMMA, u",") + COLON = pytree.Leaf(token.COLON, u":") + SEPS = (COMMA, COLON) + + def transform(self, node, results): + new = node.clone() + comma = False + for child in new.children: + if child in self.SEPS: + prefix = child.prefix + if prefix.isspace() and u"\n" not in prefix: + child.prefix = u"" + comma = True + else: + if comma: + prefix = child.prefix + if not prefix: + child.prefix = u" " + comma = False + return new diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_xrange.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_xrange.py new file mode 100644 index 000000000000..f1436724b454 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_xrange.py @@ -0,0 +1,73 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer that changes xrange(...) into range(...).""" + +# Local imports +from .. import fixer_base +from ..fixer_util import Name, Call, consuming_calls +from .. import patcomp + + +class FixXrange(fixer_base.BaseFix): + BM_compatible = True + PATTERN = """ + power< + (name='range'|name='xrange') trailer< '(' args=any ')' > + rest=any* > + """ + + def start_tree(self, tree, filename): + super(FixXrange, self).start_tree(tree, filename) + self.transformed_xranges = set() + + def finish_tree(self, tree, filename): + self.transformed_xranges = None + + def transform(self, node, results): + name = results["name"] + if name.value == u"xrange": + return self.transform_xrange(node, results) + elif name.value == u"range": + return self.transform_range(node, results) + else: + raise ValueError(repr(name)) + + def transform_xrange(self, node, results): + name = results["name"] + name.replace(Name(u"range", prefix=name.prefix)) + # This prevents the new range call from being wrapped in a list later. + self.transformed_xranges.add(id(node)) + + def transform_range(self, node, results): + if (id(node) not in self.transformed_xranges and + not self.in_special_context(node)): + range_call = Call(Name(u"range"), [results["args"].clone()]) + # Encase the range call in list(). + list_call = Call(Name(u"list"), [range_call], + prefix=node.prefix) + # Put things that were after the range() call after the list call. + for n in results["rest"]: + list_call.append_child(n) + return list_call + + P1 = "power< func=NAME trailer< '(' node=any ')' > any* >" + p1 = patcomp.compile_pattern(P1) + + P2 = """for_stmt< 'for' any 'in' node=any ':' any* > + | comp_for< 'for' any 'in' node=any any* > + | comparison< any 'in' node=any any*> + """ + p2 = patcomp.compile_pattern(P2) + + def in_special_context(self, node): + if node.parent is None: + return False + results = {} + if (node.parent.parent is not None and + self.p1.match(node.parent.parent, results) and + results["node"] is node): + # list(d.keys()) -> list(d.keys()), etc. + return results["func"].value in consuming_calls + # for ... in d.iterkeys() -> for ... in d.keys(), etc. + return self.p2.match(node.parent, results) and results["node"] is node diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_xreadlines.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_xreadlines.py new file mode 100644 index 000000000000..f50b9a27558f --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_xreadlines.py @@ -0,0 +1,25 @@ +"""Fix "for x in f.xreadlines()" -> "for x in f". + +This fixer will also convert g(f.xreadlines) into g(f.__iter__).""" +# Author: Collin Winter + +# Local imports +from .. import fixer_base +from ..fixer_util import Name + + +class FixXreadlines(fixer_base.BaseFix): + BM_compatible = True + PATTERN = """ + power< call=any+ trailer< '.' 'xreadlines' > trailer< '(' ')' > > + | + power< any+ trailer< '.' no_call='xreadlines' > > + """ + + def transform(self, node, results): + no_call = results.get("no_call") + + if no_call: + no_call.replace(Name(u"__iter__", prefix=no_call.prefix)) + else: + node.replace([x.clone() for x in results["call"]]) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_zip.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_zip.py new file mode 100644 index 000000000000..c5d7b66d6739 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_zip.py @@ -0,0 +1,35 @@ +""" +Fixer that changes zip(seq0, seq1, ...) into list(zip(seq0, seq1, ...) +unless there exists a 'from future_builtins import zip' statement in the +top-level namespace. + +We avoid the transformation if the zip() call is directly contained in +iter(<>), list(<>), tuple(<>), sorted(<>), ...join(<>), or for V in <>:. +""" + +# Local imports +from .. import fixer_base +from ..fixer_util import Name, Call, in_special_context + +class FixZip(fixer_base.ConditionalFix): + + BM_compatible = True + PATTERN = """ + power< 'zip' args=trailer< '(' [any] ')' > + > + """ + + skip_on = "future_builtins.zip" + + def transform(self, node, results): + if self.should_skip(node): + return + + if in_special_context(node): + return None + + new = node.clone() + new.prefix = u"" + new = Call(Name(u"list"), [new]) + new.prefix = node.prefix + return new diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/main.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/main.py new file mode 100644 index 000000000000..ad0625e52730 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/main.py @@ -0,0 +1,269 @@ +""" +Main program for 2to3. +""" + +from __future__ import with_statement + +import sys +import os +import difflib +import logging +import shutil +import optparse + +from . import refactor + + +def diff_texts(a, b, filename): + """Return a unified diff of two strings.""" + a = a.splitlines() + b = b.splitlines() + return difflib.unified_diff(a, b, filename, filename, + "(original)", "(refactored)", + lineterm="") + + +class StdoutRefactoringTool(refactor.MultiprocessRefactoringTool): + """ + A refactoring tool that can avoid overwriting its input files. + Prints output to stdout. + + Output files can optionally be written to a different directory and or + have an extra file suffix appended to their name for use in situations + where you do not want to replace the input files. + """ + + def __init__(self, fixers, options, explicit, nobackups, show_diffs, + input_base_dir='', output_dir='', append_suffix=''): + """ + Args: + fixers: A list of fixers to import. + options: A dict with RefactoringTool configuration. + explicit: A list of fixers to run even if they are explicit. + nobackups: If true no backup '.bak' files will be created for those + files that are being refactored. + show_diffs: Should diffs of the refactoring be printed to stdout? + input_base_dir: The base directory for all input files. This class + will strip this path prefix off of filenames before substituting + it with output_dir. Only meaningful if output_dir is supplied. + All files processed by refactor() must start with this path. + output_dir: If supplied, all converted files will be written into + this directory tree instead of input_base_dir. + append_suffix: If supplied, all files output by this tool will have + this appended to their filename. Useful for changing .py to + .py3 for example by passing append_suffix='3'. + """ + self.nobackups = nobackups + self.show_diffs = show_diffs + if input_base_dir and not input_base_dir.endswith(os.sep): + input_base_dir += os.sep + self._input_base_dir = input_base_dir + self._output_dir = output_dir + self._append_suffix = append_suffix + super(StdoutRefactoringTool, self).__init__(fixers, options, explicit) + + def log_error(self, msg, *args, **kwargs): + self.errors.append((msg, args, kwargs)) + self.logger.error(msg, *args, **kwargs) + + def write_file(self, new_text, filename, old_text, encoding): + orig_filename = filename + if self._output_dir: + if filename.startswith(self._input_base_dir): + filename = os.path.join(self._output_dir, + filename[len(self._input_base_dir):]) + else: + raise ValueError('filename %s does not start with the ' + 'input_base_dir %s' % ( + filename, self._input_base_dir)) + if self._append_suffix: + filename += self._append_suffix + if orig_filename != filename: + output_dir = os.path.dirname(filename) + if not os.path.isdir(output_dir): + os.makedirs(output_dir) + self.log_message('Writing converted %s to %s.', orig_filename, + filename) + if not self.nobackups: + # Make backup + backup = filename + ".bak" + if os.path.lexists(backup): + try: + os.remove(backup) + except os.error, err: + self.log_message("Can't remove backup %s", backup) + try: + os.rename(filename, backup) + except os.error, err: + self.log_message("Can't rename %s to %s", filename, backup) + # Actually write the new file + write = super(StdoutRefactoringTool, self).write_file + write(new_text, filename, old_text, encoding) + if not self.nobackups: + shutil.copymode(backup, filename) + if orig_filename != filename: + # Preserve the file mode in the new output directory. + shutil.copymode(orig_filename, filename) + + def print_output(self, old, new, filename, equal): + if equal: + self.log_message("No changes to %s", filename) + else: + self.log_message("Refactored %s", filename) + if self.show_diffs: + diff_lines = diff_texts(old, new, filename) + try: + if self.output_lock is not None: + with self.output_lock: + for line in diff_lines: + print line + sys.stdout.flush() + else: + for line in diff_lines: + print line + except UnicodeEncodeError: + warn("couldn't encode %s's diff for your terminal" % + (filename,)) + return + + +def warn(msg): + print >> sys.stderr, "WARNING: %s" % (msg,) + + +def main(fixer_pkg, args=None): + """Main program. + + Args: + fixer_pkg: the name of a package where the fixers are located. + args: optional; a list of command line arguments. If omitted, + sys.argv[1:] is used. + + Returns a suggested exit status (0, 1, 2). + """ + # Set up option parser + parser = optparse.OptionParser(usage="2to3 [options] file|dir ...") + parser.add_option("-d", "--doctests_only", action="store_true", + help="Fix up doctests only") + parser.add_option("-f", "--fix", action="append", default=[], + help="Each FIX specifies a transformation; default: all") + parser.add_option("-j", "--processes", action="store", default=1, + type="int", help="Run 2to3 concurrently") + parser.add_option("-x", "--nofix", action="append", default=[], + help="Prevent a transformation from being run") + parser.add_option("-l", "--list-fixes", action="store_true", + help="List available transformations") + parser.add_option("-p", "--print-function", action="store_true", + help="Modify the grammar so that print() is a function") + parser.add_option("-v", "--verbose", action="store_true", + help="More verbose logging") + parser.add_option("--no-diffs", action="store_true", + help="Don't show diffs of the refactoring") + parser.add_option("-w", "--write", action="store_true", + help="Write back modified files") + parser.add_option("-n", "--nobackups", action="store_true", default=False, + help="Don't write backups for modified files") + parser.add_option("-o", "--output-dir", action="store", type="str", + default="", help="Put output files in this directory " + "instead of overwriting the input files. Requires -n.") + parser.add_option("-W", "--write-unchanged-files", action="store_true", + help="Also write files even if no changes were required" + " (useful with --output-dir); implies -w.") + parser.add_option("--add-suffix", action="store", type="str", default="", + help="Append this string to all output filenames." + " Requires -n if non-empty. " + "ex: --add-suffix='3' will generate .py3 files.") + + # Parse command line arguments + refactor_stdin = False + flags = {} + options, args = parser.parse_args(args) + if options.write_unchanged_files: + flags["write_unchanged_files"] = True + if not options.write: + warn("--write-unchanged-files/-W implies -w.") + options.write = True + # If we allowed these, the original files would be renamed to backup names + # but not replaced. + if options.output_dir and not options.nobackups: + parser.error("Can't use --output-dir/-o without -n.") + if options.add_suffix and not options.nobackups: + parser.error("Can't use --add-suffix without -n.") + + if not options.write and options.no_diffs: + warn("not writing files and not printing diffs; that's not very useful") + if not options.write and options.nobackups: + parser.error("Can't use -n without -w") + if options.list_fixes: + print "Available transformations for the -f/--fix option:" + for fixname in refactor.get_all_fix_names(fixer_pkg): + print fixname + if not args: + return 0 + if not args: + print >> sys.stderr, "At least one file or directory argument required." + print >> sys.stderr, "Use --help to show usage." + return 2 + if "-" in args: + refactor_stdin = True + if options.write: + print >> sys.stderr, "Can't write to stdin." + return 2 + if options.print_function: + flags["print_function"] = True + + # Set up logging handler + level = logging.DEBUG if options.verbose else logging.INFO + logging.basicConfig(format='%(name)s: %(message)s', level=level) + logger = logging.getLogger('lib2to3.main') + + # Initialize the refactoring tool + avail_fixes = set(refactor.get_fixers_from_package(fixer_pkg)) + unwanted_fixes = set(fixer_pkg + ".fix_" + fix for fix in options.nofix) + explicit = set() + if options.fix: + all_present = False + for fix in options.fix: + if fix == "all": + all_present = True + else: + explicit.add(fixer_pkg + ".fix_" + fix) + requested = avail_fixes.union(explicit) if all_present else explicit + else: + requested = avail_fixes.union(explicit) + fixer_names = requested.difference(unwanted_fixes) + input_base_dir = os.path.commonprefix(args) + if (input_base_dir and not input_base_dir.endswith(os.sep) + and not os.path.isdir(input_base_dir)): + # One or more similar names were passed, their directory is the base. + # os.path.commonprefix() is ignorant of path elements, this corrects + # for that weird API. + input_base_dir = os.path.dirname(input_base_dir) + if options.output_dir: + input_base_dir = input_base_dir.rstrip(os.sep) + logger.info('Output in %r will mirror the input directory %r layout.', + options.output_dir, input_base_dir) + rt = StdoutRefactoringTool( + sorted(fixer_names), flags, sorted(explicit), + options.nobackups, not options.no_diffs, + input_base_dir=input_base_dir, + output_dir=options.output_dir, + append_suffix=options.add_suffix) + + # Refactor all files and directories passed as arguments + if not rt.errors: + if refactor_stdin: + rt.refactor_stdin() + else: + try: + rt.refactor(args, options.write, options.doctests_only, + options.processes) + except refactor.MultiprocessingUnsupported: + assert options.processes > 1 + print >> sys.stderr, "Sorry, -j isn't " \ + "supported on this platform." + return 1 + rt.summarize() + + # Return error status (0 if rt.errors is zero) + return int(bool(rt.errors)) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/patcomp.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/patcomp.py new file mode 100644 index 000000000000..093e5f9f8df0 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/patcomp.py @@ -0,0 +1,205 @@ +# Copyright 2006 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Pattern compiler. + +The grammer is taken from PatternGrammar.txt. + +The compiler compiles a pattern to a pytree.*Pattern instance. +""" + +__author__ = "Guido van Rossum " + +# Python imports +import os +import StringIO + +# Fairly local imports +from .pgen2 import driver, literals, token, tokenize, parse, grammar + +# Really local imports +from . import pytree +from . import pygram + +# The pattern grammar file +_PATTERN_GRAMMAR_FILE = os.path.join(os.path.dirname(__file__), + "PatternGrammar.txt") + + +class PatternSyntaxError(Exception): + pass + + +def tokenize_wrapper(input): + """Tokenizes a string suppressing significant whitespace.""" + skip = set((token.NEWLINE, token.INDENT, token.DEDENT)) + tokens = tokenize.generate_tokens(StringIO.StringIO(input).readline) + for quintuple in tokens: + type, value, start, end, line_text = quintuple + if type not in skip: + yield quintuple + + +class PatternCompiler(object): + + def __init__(self, grammar_file=_PATTERN_GRAMMAR_FILE): + """Initializer. + + Takes an optional alternative filename for the pattern grammar. + """ + self.grammar = driver.load_grammar(grammar_file) + self.syms = pygram.Symbols(self.grammar) + self.pygrammar = pygram.python_grammar + self.pysyms = pygram.python_symbols + self.driver = driver.Driver(self.grammar, convert=pattern_convert) + + def compile_pattern(self, input, debug=False, with_tree=False): + """Compiles a pattern string to a nested pytree.*Pattern object.""" + tokens = tokenize_wrapper(input) + try: + root = self.driver.parse_tokens(tokens, debug=debug) + except parse.ParseError as e: + raise PatternSyntaxError(str(e)) + if with_tree: + return self.compile_node(root), root + else: + return self.compile_node(root) + + def compile_node(self, node): + """Compiles a node, recursively. + + This is one big switch on the node type. + """ + # XXX Optimize certain Wildcard-containing-Wildcard patterns + # that can be merged + if node.type == self.syms.Matcher: + node = node.children[0] # Avoid unneeded recursion + + if node.type == self.syms.Alternatives: + # Skip the odd children since they are just '|' tokens + alts = [self.compile_node(ch) for ch in node.children[::2]] + if len(alts) == 1: + return alts[0] + p = pytree.WildcardPattern([[a] for a in alts], min=1, max=1) + return p.optimize() + + if node.type == self.syms.Alternative: + units = [self.compile_node(ch) for ch in node.children] + if len(units) == 1: + return units[0] + p = pytree.WildcardPattern([units], min=1, max=1) + return p.optimize() + + if node.type == self.syms.NegatedUnit: + pattern = self.compile_basic(node.children[1:]) + p = pytree.NegatedPattern(pattern) + return p.optimize() + + assert node.type == self.syms.Unit + + name = None + nodes = node.children + if len(nodes) >= 3 and nodes[1].type == token.EQUAL: + name = nodes[0].value + nodes = nodes[2:] + repeat = None + if len(nodes) >= 2 and nodes[-1].type == self.syms.Repeater: + repeat = nodes[-1] + nodes = nodes[:-1] + + # Now we've reduced it to: STRING | NAME [Details] | (...) | [...] + pattern = self.compile_basic(nodes, repeat) + + if repeat is not None: + assert repeat.type == self.syms.Repeater + children = repeat.children + child = children[0] + if child.type == token.STAR: + min = 0 + max = pytree.HUGE + elif child.type == token.PLUS: + min = 1 + max = pytree.HUGE + elif child.type == token.LBRACE: + assert children[-1].type == token.RBRACE + assert len(children) in (3, 5) + min = max = self.get_int(children[1]) + if len(children) == 5: + max = self.get_int(children[3]) + else: + assert False + if min != 1 or max != 1: + pattern = pattern.optimize() + pattern = pytree.WildcardPattern([[pattern]], min=min, max=max) + + if name is not None: + pattern.name = name + return pattern.optimize() + + def compile_basic(self, nodes, repeat=None): + # Compile STRING | NAME [Details] | (...) | [...] + assert len(nodes) >= 1 + node = nodes[0] + if node.type == token.STRING: + value = unicode(literals.evalString(node.value)) + return pytree.LeafPattern(_type_of_literal(value), value) + elif node.type == token.NAME: + value = node.value + if value.isupper(): + if value not in TOKEN_MAP: + raise PatternSyntaxError("Invalid token: %r" % value) + if nodes[1:]: + raise PatternSyntaxError("Can't have details for token") + return pytree.LeafPattern(TOKEN_MAP[value]) + else: + if value == "any": + type = None + elif not value.startswith("_"): + type = getattr(self.pysyms, value, None) + if type is None: + raise PatternSyntaxError("Invalid symbol: %r" % value) + if nodes[1:]: # Details present + content = [self.compile_node(nodes[1].children[1])] + else: + content = None + return pytree.NodePattern(type, content) + elif node.value == "(": + return self.compile_node(nodes[1]) + elif node.value == "[": + assert repeat is None + subpattern = self.compile_node(nodes[1]) + return pytree.WildcardPattern([[subpattern]], min=0, max=1) + assert False, node + + def get_int(self, node): + assert node.type == token.NUMBER + return int(node.value) + + +# Map named tokens to the type value for a LeafPattern +TOKEN_MAP = {"NAME": token.NAME, + "STRING": token.STRING, + "NUMBER": token.NUMBER, + "TOKEN": None} + + +def _type_of_literal(value): + if value[0].isalpha(): + return token.NAME + elif value in grammar.opmap: + return grammar.opmap[value] + else: + return None + + +def pattern_convert(grammar, raw_node_info): + """Converts raw node information to a Node or Leaf instance.""" + type, value, context, children = raw_node_info + if children or type in grammar.number2symbol: + return pytree.Node(type, children, context=context) + else: + return pytree.Leaf(type, value, context=context) + + +def compile_pattern(pattern): + return PatternCompiler().compile_pattern(pattern) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/__init__.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/__init__.py new file mode 100644 index 000000000000..af390484528d --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""The pgen2 package.""" diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/conv.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/conv.py new file mode 100644 index 000000000000..28fbb0b95f01 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/conv.py @@ -0,0 +1,257 @@ +# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Convert graminit.[ch] spit out by pgen to Python code. + +Pgen is the Python parser generator. It is useful to quickly create a +parser from a grammar file in Python's grammar notation. But I don't +want my parsers to be written in C (yet), so I'm translating the +parsing tables to Python data structures and writing a Python parse +engine. + +Note that the token numbers are constants determined by the standard +Python tokenizer. The standard token module defines these numbers and +their names (the names are not used much). The token numbers are +hardcoded into the Python tokenizer and into pgen. A Python +implementation of the Python tokenizer is also available, in the +standard tokenize module. + +On the other hand, symbol numbers (representing the grammar's +non-terminals) are assigned by pgen based on the actual grammar +input. + +Note: this module is pretty much obsolete; the pgen module generates +equivalent grammar tables directly from the Grammar.txt input file +without having to invoke the Python pgen C program. + +""" + +# Python imports +import re + +# Local imports +from pgen2 import grammar, token + + +class Converter(grammar.Grammar): + """Grammar subclass that reads classic pgen output files. + + The run() method reads the tables as produced by the pgen parser + generator, typically contained in two C files, graminit.h and + graminit.c. The other methods are for internal use only. + + See the base class for more documentation. + + """ + + def run(self, graminit_h, graminit_c): + """Load the grammar tables from the text files written by pgen.""" + self.parse_graminit_h(graminit_h) + self.parse_graminit_c(graminit_c) + self.finish_off() + + def parse_graminit_h(self, filename): + """Parse the .h file written by pgen. (Internal) + + This file is a sequence of #define statements defining the + nonterminals of the grammar as numbers. We build two tables + mapping the numbers to names and back. + + """ + try: + f = open(filename) + except IOError, err: + print "Can't open %s: %s" % (filename, err) + return False + self.symbol2number = {} + self.number2symbol = {} + lineno = 0 + for line in f: + lineno += 1 + mo = re.match(r"^#define\s+(\w+)\s+(\d+)$", line) + if not mo and line.strip(): + print "%s(%s): can't parse %s" % (filename, lineno, + line.strip()) + else: + symbol, number = mo.groups() + number = int(number) + assert symbol not in self.symbol2number + assert number not in self.number2symbol + self.symbol2number[symbol] = number + self.number2symbol[number] = symbol + return True + + def parse_graminit_c(self, filename): + """Parse the .c file written by pgen. (Internal) + + The file looks as follows. The first two lines are always this: + + #include "pgenheaders.h" + #include "grammar.h" + + After that come four blocks: + + 1) one or more state definitions + 2) a table defining dfas + 3) a table defining labels + 4) a struct defining the grammar + + A state definition has the following form: + - one or more arc arrays, each of the form: + static arc arcs__[] = { + {, }, + ... + }; + - followed by a state array, of the form: + static state states_[] = { + {, arcs__}, + ... + }; + + """ + try: + f = open(filename) + except IOError, err: + print "Can't open %s: %s" % (filename, err) + return False + # The code below essentially uses f's iterator-ness! + lineno = 0 + + # Expect the two #include lines + lineno, line = lineno+1, f.next() + assert line == '#include "pgenheaders.h"\n', (lineno, line) + lineno, line = lineno+1, f.next() + assert line == '#include "grammar.h"\n', (lineno, line) + + # Parse the state definitions + lineno, line = lineno+1, f.next() + allarcs = {} + states = [] + while line.startswith("static arc "): + while line.startswith("static arc "): + mo = re.match(r"static arc arcs_(\d+)_(\d+)\[(\d+)\] = {$", + line) + assert mo, (lineno, line) + n, m, k = map(int, mo.groups()) + arcs = [] + for _ in range(k): + lineno, line = lineno+1, f.next() + mo = re.match(r"\s+{(\d+), (\d+)},$", line) + assert mo, (lineno, line) + i, j = map(int, mo.groups()) + arcs.append((i, j)) + lineno, line = lineno+1, f.next() + assert line == "};\n", (lineno, line) + allarcs[(n, m)] = arcs + lineno, line = lineno+1, f.next() + mo = re.match(r"static state states_(\d+)\[(\d+)\] = {$", line) + assert mo, (lineno, line) + s, t = map(int, mo.groups()) + assert s == len(states), (lineno, line) + state = [] + for _ in range(t): + lineno, line = lineno+1, f.next() + mo = re.match(r"\s+{(\d+), arcs_(\d+)_(\d+)},$", line) + assert mo, (lineno, line) + k, n, m = map(int, mo.groups()) + arcs = allarcs[n, m] + assert k == len(arcs), (lineno, line) + state.append(arcs) + states.append(state) + lineno, line = lineno+1, f.next() + assert line == "};\n", (lineno, line) + lineno, line = lineno+1, f.next() + self.states = states + + # Parse the dfas + dfas = {} + mo = re.match(r"static dfa dfas\[(\d+)\] = {$", line) + assert mo, (lineno, line) + ndfas = int(mo.group(1)) + for i in range(ndfas): + lineno, line = lineno+1, f.next() + mo = re.match(r'\s+{(\d+), "(\w+)", (\d+), (\d+), states_(\d+),$', + line) + assert mo, (lineno, line) + symbol = mo.group(2) + number, x, y, z = map(int, mo.group(1, 3, 4, 5)) + assert self.symbol2number[symbol] == number, (lineno, line) + assert self.number2symbol[number] == symbol, (lineno, line) + assert x == 0, (lineno, line) + state = states[z] + assert y == len(state), (lineno, line) + lineno, line = lineno+1, f.next() + mo = re.match(r'\s+("(?:\\\d\d\d)*")},$', line) + assert mo, (lineno, line) + first = {} + rawbitset = eval(mo.group(1)) + for i, c in enumerate(rawbitset): + byte = ord(c) + for j in range(8): + if byte & (1<= os.path.getmtime(b) + + +def main(*args): + """Main program, when run as a script: produce grammar pickle files. + + Calls load_grammar for each argument, a path to a grammar text file. + """ + if not args: + args = sys.argv[1:] + logging.basicConfig(level=logging.INFO, stream=sys.stdout, + format='%(message)s') + for gt in args: + load_grammar(gt, save=True, force=True) + return True + +if __name__ == "__main__": + sys.exit(int(not main())) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/grammar.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/grammar.py new file mode 100644 index 000000000000..9df5244436a2 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/grammar.py @@ -0,0 +1,184 @@ +# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""This module defines the data structures used to represent a grammar. + +These are a bit arcane because they are derived from the data +structures used by Python's 'pgen' parser generator. + +There's also a table here mapping operators to their names in the +token module; the Python tokenize module reports all operators as the +fallback token code OP, but the parser needs the actual token code. + +""" + +# Python imports +import pickle + +# Local imports +from . import token + + +class Grammar(object): + """Pgen parsing tables conversion class. + + Once initialized, this class supplies the grammar tables for the + parsing engine implemented by parse.py. The parsing engine + accesses the instance variables directly. The class here does not + provide initialization of the tables; several subclasses exist to + do this (see the conv and pgen modules). + + The load() method reads the tables from a pickle file, which is + much faster than the other ways offered by subclasses. The pickle + file is written by calling dump() (after loading the grammar + tables using a subclass). The report() method prints a readable + representation of the tables to stdout, for debugging. + + The instance variables are as follows: + + symbol2number -- a dict mapping symbol names to numbers. Symbol + numbers are always 256 or higher, to distinguish + them from token numbers, which are between 0 and + 255 (inclusive). + + number2symbol -- a dict mapping numbers to symbol names; + these two are each other's inverse. + + states -- a list of DFAs, where each DFA is a list of + states, each state is a list of arcs, and each + arc is a (i, j) pair where i is a label and j is + a state number. The DFA number is the index into + this list. (This name is slightly confusing.) + Final states are represented by a special arc of + the form (0, j) where j is its own state number. + + dfas -- a dict mapping symbol numbers to (DFA, first) + pairs, where DFA is an item from the states list + above, and first is a set of tokens that can + begin this grammar rule (represented by a dict + whose values are always 1). + + labels -- a list of (x, y) pairs where x is either a token + number or a symbol number, and y is either None + or a string; the strings are keywords. The label + number is the index in this list; label numbers + are used to mark state transitions (arcs) in the + DFAs. + + start -- the number of the grammar's start symbol. + + keywords -- a dict mapping keyword strings to arc labels. + + tokens -- a dict mapping token numbers to arc labels. + + """ + + def __init__(self): + self.symbol2number = {} + self.number2symbol = {} + self.states = [] + self.dfas = {} + self.labels = [(0, "EMPTY")] + self.keywords = {} + self.tokens = {} + self.symbol2label = {} + self.start = 256 + + def dump(self, filename): + """Dump the grammar tables to a pickle file.""" + f = open(filename, "wb") + pickle.dump(self.__dict__, f, 2) + f.close() + + def load(self, filename): + """Load the grammar tables from a pickle file.""" + f = open(filename, "rb") + d = pickle.load(f) + f.close() + self.__dict__.update(d) + + def copy(self): + """ + Copy the grammar. + """ + new = self.__class__() + for dict_attr in ("symbol2number", "number2symbol", "dfas", "keywords", + "tokens", "symbol2label"): + setattr(new, dict_attr, getattr(self, dict_attr).copy()) + new.labels = self.labels[:] + new.states = self.states[:] + new.start = self.start + return new + + def report(self): + """Dump the grammar tables to standard output, for debugging.""" + from pprint import pprint + print "s2n" + pprint(self.symbol2number) + print "n2s" + pprint(self.number2symbol) + print "states" + pprint(self.states) + print "dfas" + pprint(self.dfas) + print "labels" + pprint(self.labels) + print "start", self.start + + +# Map from operator to number (since tokenize doesn't do this) + +opmap_raw = """ +( LPAR +) RPAR +[ LSQB +] RSQB +: COLON +, COMMA +; SEMI ++ PLUS +- MINUS +* STAR +/ SLASH +| VBAR +& AMPER +< LESS +> GREATER += EQUAL +. DOT +% PERCENT +` BACKQUOTE +{ LBRACE +} RBRACE +@ AT +== EQEQUAL +!= NOTEQUAL +<> NOTEQUAL +<= LESSEQUAL +>= GREATEREQUAL +~ TILDE +^ CIRCUMFLEX +<< LEFTSHIFT +>> RIGHTSHIFT +** DOUBLESTAR ++= PLUSEQUAL +-= MINEQUAL +*= STAREQUAL +/= SLASHEQUAL +%= PERCENTEQUAL +&= AMPEREQUAL +|= VBAREQUAL +^= CIRCUMFLEXEQUAL +<<= LEFTSHIFTEQUAL +>>= RIGHTSHIFTEQUAL +**= DOUBLESTAREQUAL +// DOUBLESLASH +//= DOUBLESLASHEQUAL +-> RARROW +""" + +opmap = {} +for line in opmap_raw.splitlines(): + if line: + op, name = line.split() + opmap[op] = getattr(token, name) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/literals.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/literals.py new file mode 100644 index 000000000000..0b3948a54ead --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/literals.py @@ -0,0 +1,60 @@ +# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Safely evaluate Python string literals without using eval().""" + +import re + +simple_escapes = {"a": "\a", + "b": "\b", + "f": "\f", + "n": "\n", + "r": "\r", + "t": "\t", + "v": "\v", + "'": "'", + '"': '"', + "\\": "\\"} + +def escape(m): + all, tail = m.group(0, 1) + assert all.startswith("\\") + esc = simple_escapes.get(tail) + if esc is not None: + return esc + if tail.startswith("x"): + hexes = tail[1:] + if len(hexes) < 2: + raise ValueError("invalid hex string escape ('\\%s')" % tail) + try: + i = int(hexes, 16) + except ValueError: + raise ValueError("invalid hex string escape ('\\%s')" % tail) + else: + try: + i = int(tail, 8) + except ValueError: + raise ValueError("invalid octal string escape ('\\%s')" % tail) + return chr(i) + +def evalString(s): + assert s.startswith("'") or s.startswith('"'), repr(s[:1]) + q = s[0] + if s[:3] == q*3: + q = q*3 + assert s.endswith(q), repr(s[-len(q):]) + assert len(s) >= 2*len(q) + s = s[len(q):-len(q)] + return re.sub(r"\\(\'|\"|\\|[abfnrtv]|x.{0,2}|[0-7]{1,3})", escape, s) + +def test(): + for i in range(256): + c = chr(i) + s = repr(c) + e = evalString(s) + if e != c: + print i, c, s, e + + +if __name__ == "__main__": + test() diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/parse.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/parse.py new file mode 100644 index 000000000000..6bebdbba7e52 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/parse.py @@ -0,0 +1,201 @@ +# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Parser engine for the grammar tables generated by pgen. + +The grammar table must be loaded first. + +See Parser/parser.c in the Python distribution for additional info on +how this parsing engine works. + +""" + +# Local imports +from . import token + +class ParseError(Exception): + """Exception to signal the parser is stuck.""" + + def __init__(self, msg, type, value, context): + Exception.__init__(self, "%s: type=%r, value=%r, context=%r" % + (msg, type, value, context)) + self.msg = msg + self.type = type + self.value = value + self.context = context + +class Parser(object): + """Parser engine. + + The proper usage sequence is: + + p = Parser(grammar, [converter]) # create instance + p.setup([start]) # prepare for parsing + : + if p.addtoken(...): # parse a token; may raise ParseError + break + root = p.rootnode # root of abstract syntax tree + + A Parser instance may be reused by calling setup() repeatedly. + + A Parser instance contains state pertaining to the current token + sequence, and should not be used concurrently by different threads + to parse separate token sequences. + + See driver.py for how to get input tokens by tokenizing a file or + string. + + Parsing is complete when addtoken() returns True; the root of the + abstract syntax tree can then be retrieved from the rootnode + instance variable. When a syntax error occurs, addtoken() raises + the ParseError exception. There is no error recovery; the parser + cannot be used after a syntax error was reported (but it can be + reinitialized by calling setup()). + + """ + + def __init__(self, grammar, convert=None): + """Constructor. + + The grammar argument is a grammar.Grammar instance; see the + grammar module for more information. + + The parser is not ready yet for parsing; you must call the + setup() method to get it started. + + The optional convert argument is a function mapping concrete + syntax tree nodes to abstract syntax tree nodes. If not + given, no conversion is done and the syntax tree produced is + the concrete syntax tree. If given, it must be a function of + two arguments, the first being the grammar (a grammar.Grammar + instance), and the second being the concrete syntax tree node + to be converted. The syntax tree is converted from the bottom + up. + + A concrete syntax tree node is a (type, value, context, nodes) + tuple, where type is the node type (a token or symbol number), + value is None for symbols and a string for tokens, context is + None or an opaque value used for error reporting (typically a + (lineno, offset) pair), and nodes is a list of children for + symbols, and None for tokens. + + An abstract syntax tree node may be anything; this is entirely + up to the converter function. + + """ + self.grammar = grammar + self.convert = convert or (lambda grammar, node: node) + + def setup(self, start=None): + """Prepare for parsing. + + This *must* be called before starting to parse. + + The optional argument is an alternative start symbol; it + defaults to the grammar's start symbol. + + You can use a Parser instance to parse any number of programs; + each time you call setup() the parser is reset to an initial + state determined by the (implicit or explicit) start symbol. + + """ + if start is None: + start = self.grammar.start + # Each stack entry is a tuple: (dfa, state, node). + # A node is a tuple: (type, value, context, children), + # where children is a list of nodes or None, and context may be None. + newnode = (start, None, None, []) + stackentry = (self.grammar.dfas[start], 0, newnode) + self.stack = [stackentry] + self.rootnode = None + self.used_names = set() # Aliased to self.rootnode.used_names in pop() + + def addtoken(self, type, value, context): + """Add a token; return True iff this is the end of the program.""" + # Map from token to label + ilabel = self.classify(type, value, context) + # Loop until the token is shifted; may raise exceptions + while True: + dfa, state, node = self.stack[-1] + states, first = dfa + arcs = states[state] + # Look for a state with this label + for i, newstate in arcs: + t, v = self.grammar.labels[i] + if ilabel == i: + # Look it up in the list of labels + assert t < 256 + # Shift a token; we're done with it + self.shift(type, value, newstate, context) + # Pop while we are in an accept-only state + state = newstate + while states[state] == [(0, state)]: + self.pop() + if not self.stack: + # Done parsing! + return True + dfa, state, node = self.stack[-1] + states, first = dfa + # Done with this token + return False + elif t >= 256: + # See if it's a symbol and if we're in its first set + itsdfa = self.grammar.dfas[t] + itsstates, itsfirst = itsdfa + if ilabel in itsfirst: + # Push a symbol + self.push(t, self.grammar.dfas[t], newstate, context) + break # To continue the outer while loop + else: + if (0, state) in arcs: + # An accepting state, pop it and try something else + self.pop() + if not self.stack: + # Done parsing, but another token is input + raise ParseError("too much input", + type, value, context) + else: + # No success finding a transition + raise ParseError("bad input", type, value, context) + + def classify(self, type, value, context): + """Turn a token into a label. (Internal)""" + if type == token.NAME: + # Keep a listing of all used names + self.used_names.add(value) + # Check for reserved words + ilabel = self.grammar.keywords.get(value) + if ilabel is not None: + return ilabel + ilabel = self.grammar.tokens.get(type) + if ilabel is None: + raise ParseError("bad token", type, value, context) + return ilabel + + def shift(self, type, value, newstate, context): + """Shift a token. (Internal)""" + dfa, state, node = self.stack[-1] + newnode = (type, value, context, None) + newnode = self.convert(self.grammar, newnode) + if newnode is not None: + node[-1].append(newnode) + self.stack[-1] = (dfa, newstate, node) + + def push(self, type, newdfa, newstate, context): + """Push a nonterminal. (Internal)""" + dfa, state, node = self.stack[-1] + newnode = (type, None, context, []) + self.stack[-1] = (dfa, newstate, node) + self.stack.append((newdfa, 0, newnode)) + + def pop(self): + """Pop a nonterminal. (Internal)""" + popdfa, popstate, popnode = self.stack.pop() + newnode = self.convert(self.grammar, popnode) + if newnode is not None: + if self.stack: + dfa, state, node = self.stack[-1] + node[-1].append(newnode) + else: + self.rootnode = newnode + self.rootnode.used_names = self.used_names diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/pgen.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/pgen.py new file mode 100644 index 000000000000..63084a4cd5be --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/pgen.py @@ -0,0 +1,386 @@ +# Copyright 2004-2005 Elemental Security, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +# Pgen imports +from . import grammar, token, tokenize + +class PgenGrammar(grammar.Grammar): + pass + +class ParserGenerator(object): + + def __init__(self, filename, stream=None): + close_stream = None + if stream is None: + stream = open(filename) + close_stream = stream.close + self.filename = filename + self.stream = stream + self.generator = tokenize.generate_tokens(stream.readline) + self.gettoken() # Initialize lookahead + self.dfas, self.startsymbol = self.parse() + if close_stream is not None: + close_stream() + self.first = {} # map from symbol name to set of tokens + self.addfirstsets() + + def make_grammar(self): + c = PgenGrammar() + names = self.dfas.keys() + names.sort() + names.remove(self.startsymbol) + names.insert(0, self.startsymbol) + for name in names: + i = 256 + len(c.symbol2number) + c.symbol2number[name] = i + c.number2symbol[i] = name + for name in names: + dfa = self.dfas[name] + states = [] + for state in dfa: + arcs = [] + for label, next in state.arcs.iteritems(): + arcs.append((self.make_label(c, label), dfa.index(next))) + if state.isfinal: + arcs.append((0, dfa.index(state))) + states.append(arcs) + c.states.append(states) + c.dfas[c.symbol2number[name]] = (states, self.make_first(c, name)) + c.start = c.symbol2number[self.startsymbol] + return c + + def make_first(self, c, name): + rawfirst = self.first[name] + first = {} + for label in rawfirst: + ilabel = self.make_label(c, label) + ##assert ilabel not in first # XXX failed on <> ... != + first[ilabel] = 1 + return first + + def make_label(self, c, label): + # XXX Maybe this should be a method on a subclass of converter? + ilabel = len(c.labels) + if label[0].isalpha(): + # Either a symbol name or a named token + if label in c.symbol2number: + # A symbol name (a non-terminal) + if label in c.symbol2label: + return c.symbol2label[label] + else: + c.labels.append((c.symbol2number[label], None)) + c.symbol2label[label] = ilabel + return ilabel + else: + # A named token (NAME, NUMBER, STRING) + itoken = getattr(token, label, None) + assert isinstance(itoken, int), label + assert itoken in token.tok_name, label + if itoken in c.tokens: + return c.tokens[itoken] + else: + c.labels.append((itoken, None)) + c.tokens[itoken] = ilabel + return ilabel + else: + # Either a keyword or an operator + assert label[0] in ('"', "'"), label + value = eval(label) + if value[0].isalpha(): + # A keyword + if value in c.keywords: + return c.keywords[value] + else: + c.labels.append((token.NAME, value)) + c.keywords[value] = ilabel + return ilabel + else: + # An operator (any non-numeric token) + itoken = grammar.opmap[value] # Fails if unknown token + if itoken in c.tokens: + return c.tokens[itoken] + else: + c.labels.append((itoken, None)) + c.tokens[itoken] = ilabel + return ilabel + + def addfirstsets(self): + names = self.dfas.keys() + names.sort() + for name in names: + if name not in self.first: + self.calcfirst(name) + #print name, self.first[name].keys() + + def calcfirst(self, name): + dfa = self.dfas[name] + self.first[name] = None # dummy to detect left recursion + state = dfa[0] + totalset = {} + overlapcheck = {} + for label, next in state.arcs.iteritems(): + if label in self.dfas: + if label in self.first: + fset = self.first[label] + if fset is None: + raise ValueError("recursion for rule %r" % name) + else: + self.calcfirst(label) + fset = self.first[label] + totalset.update(fset) + overlapcheck[label] = fset + else: + totalset[label] = 1 + overlapcheck[label] = {label: 1} + inverse = {} + for label, itsfirst in overlapcheck.iteritems(): + for symbol in itsfirst: + if symbol in inverse: + raise ValueError("rule %s is ambiguous; %s is in the" + " first sets of %s as well as %s" % + (name, symbol, label, inverse[symbol])) + inverse[symbol] = label + self.first[name] = totalset + + def parse(self): + dfas = {} + startsymbol = None + # MSTART: (NEWLINE | RULE)* ENDMARKER + while self.type != token.ENDMARKER: + while self.type == token.NEWLINE: + self.gettoken() + # RULE: NAME ':' RHS NEWLINE + name = self.expect(token.NAME) + self.expect(token.OP, ":") + a, z = self.parse_rhs() + self.expect(token.NEWLINE) + #self.dump_nfa(name, a, z) + dfa = self.make_dfa(a, z) + #self.dump_dfa(name, dfa) + oldlen = len(dfa) + self.simplify_dfa(dfa) + newlen = len(dfa) + dfas[name] = dfa + #print name, oldlen, newlen + if startsymbol is None: + startsymbol = name + return dfas, startsymbol + + def make_dfa(self, start, finish): + # To turn an NFA into a DFA, we define the states of the DFA + # to correspond to *sets* of states of the NFA. Then do some + # state reduction. Let's represent sets as dicts with 1 for + # values. + assert isinstance(start, NFAState) + assert isinstance(finish, NFAState) + def closure(state): + base = {} + addclosure(state, base) + return base + def addclosure(state, base): + assert isinstance(state, NFAState) + if state in base: + return + base[state] = 1 + for label, next in state.arcs: + if label is None: + addclosure(next, base) + states = [DFAState(closure(start), finish)] + for state in states: # NB states grows while we're iterating + arcs = {} + for nfastate in state.nfaset: + for label, next in nfastate.arcs: + if label is not None: + addclosure(next, arcs.setdefault(label, {})) + for label, nfaset in arcs.iteritems(): + for st in states: + if st.nfaset == nfaset: + break + else: + st = DFAState(nfaset, finish) + states.append(st) + state.addarc(st, label) + return states # List of DFAState instances; first one is start + + def dump_nfa(self, name, start, finish): + print "Dump of NFA for", name + todo = [start] + for i, state in enumerate(todo): + print " State", i, state is finish and "(final)" or "" + for label, next in state.arcs: + if next in todo: + j = todo.index(next) + else: + j = len(todo) + todo.append(next) + if label is None: + print " -> %d" % j + else: + print " %s -> %d" % (label, j) + + def dump_dfa(self, name, dfa): + print "Dump of DFA for", name + for i, state in enumerate(dfa): + print " State", i, state.isfinal and "(final)" or "" + for label, next in state.arcs.iteritems(): + print " %s -> %d" % (label, dfa.index(next)) + + def simplify_dfa(self, dfa): + # This is not theoretically optimal, but works well enough. + # Algorithm: repeatedly look for two states that have the same + # set of arcs (same labels pointing to the same nodes) and + # unify them, until things stop changing. + + # dfa is a list of DFAState instances + changes = True + while changes: + changes = False + for i, state_i in enumerate(dfa): + for j in range(i+1, len(dfa)): + state_j = dfa[j] + if state_i == state_j: + #print " unify", i, j + del dfa[j] + for state in dfa: + state.unifystate(state_j, state_i) + changes = True + break + + def parse_rhs(self): + # RHS: ALT ('|' ALT)* + a, z = self.parse_alt() + if self.value != "|": + return a, z + else: + aa = NFAState() + zz = NFAState() + aa.addarc(a) + z.addarc(zz) + while self.value == "|": + self.gettoken() + a, z = self.parse_alt() + aa.addarc(a) + z.addarc(zz) + return aa, zz + + def parse_alt(self): + # ALT: ITEM+ + a, b = self.parse_item() + while (self.value in ("(", "[") or + self.type in (token.NAME, token.STRING)): + c, d = self.parse_item() + b.addarc(c) + b = d + return a, b + + def parse_item(self): + # ITEM: '[' RHS ']' | ATOM ['+' | '*'] + if self.value == "[": + self.gettoken() + a, z = self.parse_rhs() + self.expect(token.OP, "]") + a.addarc(z) + return a, z + else: + a, z = self.parse_atom() + value = self.value + if value not in ("+", "*"): + return a, z + self.gettoken() + z.addarc(a) + if value == "+": + return a, z + else: + return a, a + + def parse_atom(self): + # ATOM: '(' RHS ')' | NAME | STRING + if self.value == "(": + self.gettoken() + a, z = self.parse_rhs() + self.expect(token.OP, ")") + return a, z + elif self.type in (token.NAME, token.STRING): + a = NFAState() + z = NFAState() + a.addarc(z, self.value) + self.gettoken() + return a, z + else: + self.raise_error("expected (...) or NAME or STRING, got %s/%s", + self.type, self.value) + + def expect(self, type, value=None): + if self.type != type or (value is not None and self.value != value): + self.raise_error("expected %s/%s, got %s/%s", + type, value, self.type, self.value) + value = self.value + self.gettoken() + return value + + def gettoken(self): + tup = self.generator.next() + while tup[0] in (tokenize.COMMENT, tokenize.NL): + tup = self.generator.next() + self.type, self.value, self.begin, self.end, self.line = tup + #print token.tok_name[self.type], repr(self.value) + + def raise_error(self, msg, *args): + if args: + try: + msg = msg % args + except: + msg = " ".join([msg] + map(str, args)) + raise SyntaxError(msg, (self.filename, self.end[0], + self.end[1], self.line)) + +class NFAState(object): + + def __init__(self): + self.arcs = [] # list of (label, NFAState) pairs + + def addarc(self, next, label=None): + assert label is None or isinstance(label, str) + assert isinstance(next, NFAState) + self.arcs.append((label, next)) + +class DFAState(object): + + def __init__(self, nfaset, final): + assert isinstance(nfaset, dict) + assert isinstance(iter(nfaset).next(), NFAState) + assert isinstance(final, NFAState) + self.nfaset = nfaset + self.isfinal = final in nfaset + self.arcs = {} # map from label to DFAState + + def addarc(self, next, label): + assert isinstance(label, str) + assert label not in self.arcs + assert isinstance(next, DFAState) + self.arcs[label] = next + + def unifystate(self, old, new): + for label, next in self.arcs.iteritems(): + if next is old: + self.arcs[label] = new + + def __eq__(self, other): + # Equality test -- ignore the nfaset instance variable + assert isinstance(other, DFAState) + if self.isfinal != other.isfinal: + return False + # Can't just return self.arcs == other.arcs, because that + # would invoke this method recursively, with cycles... + if len(self.arcs) != len(other.arcs): + return False + for label, next in self.arcs.iteritems(): + if next is not other.arcs.get(label): + return False + return True + + __hash__ = None # For Py3 compatibility. + +def generate_grammar(filename="Grammar.txt"): + p = ParserGenerator(filename) + return p.make_grammar() diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/token.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/token.py new file mode 100644 index 000000000000..61468b313e7d --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/token.py @@ -0,0 +1,82 @@ +#! /usr/bin/env python + +"""Token constants (from "token.h").""" + +# Taken from Python (r53757) and modified to include some tokens +# originally monkeypatched in by pgen2.tokenize + +#--start constants-- +ENDMARKER = 0 +NAME = 1 +NUMBER = 2 +STRING = 3 +NEWLINE = 4 +INDENT = 5 +DEDENT = 6 +LPAR = 7 +RPAR = 8 +LSQB = 9 +RSQB = 10 +COLON = 11 +COMMA = 12 +SEMI = 13 +PLUS = 14 +MINUS = 15 +STAR = 16 +SLASH = 17 +VBAR = 18 +AMPER = 19 +LESS = 20 +GREATER = 21 +EQUAL = 22 +DOT = 23 +PERCENT = 24 +BACKQUOTE = 25 +LBRACE = 26 +RBRACE = 27 +EQEQUAL = 28 +NOTEQUAL = 29 +LESSEQUAL = 30 +GREATEREQUAL = 31 +TILDE = 32 +CIRCUMFLEX = 33 +LEFTSHIFT = 34 +RIGHTSHIFT = 35 +DOUBLESTAR = 36 +PLUSEQUAL = 37 +MINEQUAL = 38 +STAREQUAL = 39 +SLASHEQUAL = 40 +PERCENTEQUAL = 41 +AMPEREQUAL = 42 +VBAREQUAL = 43 +CIRCUMFLEXEQUAL = 44 +LEFTSHIFTEQUAL = 45 +RIGHTSHIFTEQUAL = 46 +DOUBLESTAREQUAL = 47 +DOUBLESLASH = 48 +DOUBLESLASHEQUAL = 49 +AT = 50 +OP = 51 +COMMENT = 52 +NL = 53 +RARROW = 54 +ERRORTOKEN = 55 +N_TOKENS = 56 +NT_OFFSET = 256 +#--end constants-- + +tok_name = {} +for _name, _value in globals().items(): + if type(_value) is type(0): + tok_name[_value] = _name + + +def ISTERMINAL(x): + return x < NT_OFFSET + +def ISNONTERMINAL(x): + return x >= NT_OFFSET + +def ISEOF(x): + return x == ENDMARKER diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/tokenize.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/tokenize.py new file mode 100644 index 000000000000..b5f28cb79157 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/tokenize.py @@ -0,0 +1,500 @@ +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Python Software Foundation. +# All rights reserved. + +"""Tokenization help for Python programs. + +generate_tokens(readline) is a generator that breaks a stream of +text into Python tokens. It accepts a readline-like method which is called +repeatedly to get the next line of input (or "" for EOF). It generates +5-tuples with these members: + + the token type (see token.py) + the token (a string) + the starting (row, column) indices of the token (a 2-tuple of ints) + the ending (row, column) indices of the token (a 2-tuple of ints) + the original line (string) + +It is designed to match the working of the Python tokenizer exactly, except +that it produces COMMENT tokens for comments and gives type OP for all +operators + +Older entry points + tokenize_loop(readline, tokeneater) + tokenize(readline, tokeneater=printtoken) +are the same, except instead of generating tokens, tokeneater is a callback +function to which the 5 fields described above are passed as 5 arguments, +each time a new token is found.""" + +__author__ = 'Ka-Ping Yee ' +__credits__ = \ + 'GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, Skip Montanaro' + +import string +import re +from codecs import BOM_UTF8, lookup +from lib2to3.pgen2.token import * +from . import token + +__all__ = [x for x in dir(token) if x[0] != '_'] + ["tokenize", + "generate_tokens", "untokenize"] +del token + +try: + bytes +except NameError: + # Support bytes type in Python <= 2.5, so 2to3 turns itself into + # valid Python 3 code. + bytes = str + +def group(*choices): return '(' + '|'.join(choices) + ')' +def any(*choices): return group(*choices) + '*' +def maybe(*choices): return group(*choices) + '?' + +Whitespace = r'[ \f\t]*' +Comment = r'#[^\r\n]*' +Ignore = Whitespace + any(r'\\\r?\n' + Whitespace) + maybe(Comment) +Name = r'[a-zA-Z_]\w*' + +Binnumber = r'0[bB][01]*' +Hexnumber = r'0[xX][\da-fA-F]*[lL]?' +Octnumber = r'0[oO]?[0-7]*[lL]?' +Decnumber = r'[1-9]\d*[lL]?' +Intnumber = group(Binnumber, Hexnumber, Octnumber, Decnumber) +Exponent = r'[eE][-+]?\d+' +Pointfloat = group(r'\d+\.\d*', r'\.\d+') + maybe(Exponent) +Expfloat = r'\d+' + Exponent +Floatnumber = group(Pointfloat, Expfloat) +Imagnumber = group(r'\d+[jJ]', Floatnumber + r'[jJ]') +Number = group(Imagnumber, Floatnumber, Intnumber) + +# Tail end of ' string. +Single = r"[^'\\]*(?:\\.[^'\\]*)*'" +# Tail end of " string. +Double = r'[^"\\]*(?:\\.[^"\\]*)*"' +# Tail end of ''' string. +Single3 = r"[^'\\]*(?:(?:\\.|'(?!''))[^'\\]*)*'''" +# Tail end of """ string. +Double3 = r'[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""' +Triple = group("[ubUB]?[rR]?'''", '[ubUB]?[rR]?"""') +# Single-line ' or " string. +String = group(r"[uU]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*'", + r'[uU]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*"') + +# Because of leftmost-then-longest match semantics, be sure to put the +# longest operators first (e.g., if = came before ==, == would get +# recognized as two instances of =). +Operator = group(r"\*\*=?", r">>=?", r"<<=?", r"<>", r"!=", + r"//=?", r"->", + r"[+\-*/%&|^=<>]=?", + r"~") + +Bracket = '[][(){}]' +Special = group(r'\r?\n', r'[:;.,`@]') +Funny = group(Operator, Bracket, Special) + +PlainToken = group(Number, Funny, String, Name) +Token = Ignore + PlainToken + +# First (or only) line of ' or " string. +ContStr = group(r"[uUbB]?[rR]?'[^\n'\\]*(?:\\.[^\n'\\]*)*" + + group("'", r'\\\r?\n'), + r'[uUbB]?[rR]?"[^\n"\\]*(?:\\.[^\n"\\]*)*' + + group('"', r'\\\r?\n')) +PseudoExtras = group(r'\\\r?\n', Comment, Triple) +PseudoToken = Whitespace + group(PseudoExtras, Number, Funny, ContStr, Name) + +tokenprog, pseudoprog, single3prog, double3prog = map( + re.compile, (Token, PseudoToken, Single3, Double3)) +endprogs = {"'": re.compile(Single), '"': re.compile(Double), + "'''": single3prog, '"""': double3prog, + "r'''": single3prog, 'r"""': double3prog, + "u'''": single3prog, 'u"""': double3prog, + "b'''": single3prog, 'b"""': double3prog, + "ur'''": single3prog, 'ur"""': double3prog, + "br'''": single3prog, 'br"""': double3prog, + "R'''": single3prog, 'R"""': double3prog, + "U'''": single3prog, 'U"""': double3prog, + "B'''": single3prog, 'B"""': double3prog, + "uR'''": single3prog, 'uR"""': double3prog, + "Ur'''": single3prog, 'Ur"""': double3prog, + "UR'''": single3prog, 'UR"""': double3prog, + "bR'''": single3prog, 'bR"""': double3prog, + "Br'''": single3prog, 'Br"""': double3prog, + "BR'''": single3prog, 'BR"""': double3prog, + 'r': None, 'R': None, + 'u': None, 'U': None, + 'b': None, 'B': None} + +triple_quoted = {} +for t in ("'''", '"""', + "r'''", 'r"""', "R'''", 'R"""', + "u'''", 'u"""', "U'''", 'U"""', + "b'''", 'b"""', "B'''", 'B"""', + "ur'''", 'ur"""', "Ur'''", 'Ur"""', + "uR'''", 'uR"""', "UR'''", 'UR"""', + "br'''", 'br"""', "Br'''", 'Br"""', + "bR'''", 'bR"""', "BR'''", 'BR"""',): + triple_quoted[t] = t +single_quoted = {} +for t in ("'", '"', + "r'", 'r"', "R'", 'R"', + "u'", 'u"', "U'", 'U"', + "b'", 'b"', "B'", 'B"', + "ur'", 'ur"', "Ur'", 'Ur"', + "uR'", 'uR"', "UR'", 'UR"', + "br'", 'br"', "Br'", 'Br"', + "bR'", 'bR"', "BR'", 'BR"', ): + single_quoted[t] = t + +tabsize = 8 + +class TokenError(Exception): pass + +class StopTokenizing(Exception): pass + +def printtoken(type, token, start, end, line): # for testing + (srow, scol) = start + (erow, ecol) = end + print "%d,%d-%d,%d:\t%s\t%s" % \ + (srow, scol, erow, ecol, tok_name[type], repr(token)) + +def tokenize(readline, tokeneater=printtoken): + """ + The tokenize() function accepts two parameters: one representing the + input stream, and one providing an output mechanism for tokenize(). + + The first parameter, readline, must be a callable object which provides + the same interface as the readline() method of built-in file objects. + Each call to the function should return one line of input as a string. + + The second parameter, tokeneater, must also be a callable object. It is + called once for each token, with five arguments, corresponding to the + tuples generated by generate_tokens(). + """ + try: + tokenize_loop(readline, tokeneater) + except StopTokenizing: + pass + +# backwards compatible interface +def tokenize_loop(readline, tokeneater): + for token_info in generate_tokens(readline): + tokeneater(*token_info) + +class Untokenizer: + + def __init__(self): + self.tokens = [] + self.prev_row = 1 + self.prev_col = 0 + + def add_whitespace(self, start): + row, col = start + assert row <= self.prev_row + col_offset = col - self.prev_col + if col_offset: + self.tokens.append(" " * col_offset) + + def untokenize(self, iterable): + for t in iterable: + if len(t) == 2: + self.compat(t, iterable) + break + tok_type, token, start, end, line = t + self.add_whitespace(start) + self.tokens.append(token) + self.prev_row, self.prev_col = end + if tok_type in (NEWLINE, NL): + self.prev_row += 1 + self.prev_col = 0 + return "".join(self.tokens) + + def compat(self, token, iterable): + startline = False + indents = [] + toks_append = self.tokens.append + toknum, tokval = token + if toknum in (NAME, NUMBER): + tokval += ' ' + if toknum in (NEWLINE, NL): + startline = True + for tok in iterable: + toknum, tokval = tok[:2] + + if toknum in (NAME, NUMBER): + tokval += ' ' + + if toknum == INDENT: + indents.append(tokval) + continue + elif toknum == DEDENT: + indents.pop() + continue + elif toknum in (NEWLINE, NL): + startline = True + elif startline and indents: + toks_append(indents[-1]) + startline = False + toks_append(tokval) + +cookie_re = re.compile(r'^[ \t\f]*#.*coding[:=][ \t]*([-\w.]+)') + +def _get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace("_", "-") + if enc == "utf-8" or enc.startswith("utf-8-"): + return "utf-8" + if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ + enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): + return "iso-8859-1" + return orig_enc + +def detect_encoding(readline): + """ + The detect_encoding() function is used to detect the encoding that should + be used to decode a Python source file. It requires one argment, readline, + in the same way as the tokenize() generator. + + It will call readline a maximum of twice, and return the encoding used + (as a string) and a list of any lines (left as bytes) it has read + in. + + It detects the encoding from the presence of a utf-8 bom or an encoding + cookie as specified in pep-0263. If both a bom and a cookie are present, but + disagree, a SyntaxError will be raised. If the encoding cookie is an invalid + charset, raise a SyntaxError. Note that if a utf-8 bom is found, + 'utf-8-sig' is returned. + + If no encoding is specified, then the default of 'utf-8' will be returned. + """ + bom_found = False + encoding = None + default = 'utf-8' + def read_or_stop(): + try: + return readline() + except StopIteration: + return bytes() + + def find_cookie(line): + try: + line_string = line.decode('ascii') + except UnicodeDecodeError: + return None + match = cookie_re.match(line_string) + if not match: + return None + encoding = _get_normal_name(match.group(1)) + try: + codec = lookup(encoding) + except LookupError: + # This behaviour mimics the Python interpreter + raise SyntaxError("unknown encoding: " + encoding) + + if bom_found: + if codec.name != 'utf-8': + # This behaviour mimics the Python interpreter + raise SyntaxError('encoding problem: utf-8') + encoding += '-sig' + return encoding + + first = read_or_stop() + if first.startswith(BOM_UTF8): + bom_found = True + first = first[3:] + default = 'utf-8-sig' + if not first: + return default, [] + + encoding = find_cookie(first) + if encoding: + return encoding, [first] + + second = read_or_stop() + if not second: + return default, [first] + + encoding = find_cookie(second) + if encoding: + return encoding, [first, second] + + return default, [first, second] + +def untokenize(iterable): + """Transform tokens back into Python source code. + + Each element returned by the iterable must be a token sequence + with at least two elements, a token number and token value. If + only two tokens are passed, the resulting output is poor. + + Round-trip invariant for full input: + Untokenized source will match input source exactly + + Round-trip invariant for limited intput: + # Output text will tokenize the back to the input + t1 = [tok[:2] for tok in generate_tokens(f.readline)] + newcode = untokenize(t1) + readline = iter(newcode.splitlines(1)).next + t2 = [tok[:2] for tokin generate_tokens(readline)] + assert t1 == t2 + """ + ut = Untokenizer() + return ut.untokenize(iterable) + +def generate_tokens(readline): + """ + The generate_tokens() generator requires one argment, readline, which + must be a callable object which provides the same interface as the + readline() method of built-in file objects. Each call to the function + should return one line of input as a string. Alternately, readline + can be a callable function terminating with StopIteration: + readline = open(myfile).next # Example of alternate readline + + The generator produces 5-tuples with these members: the token type; the + token string; a 2-tuple (srow, scol) of ints specifying the row and + column where the token begins in the source; a 2-tuple (erow, ecol) of + ints specifying the row and column where the token ends in the source; + and the line on which the token was found. The line passed is the + logical line; continuation lines are included. + """ + lnum = parenlev = continued = 0 + namechars, numchars = string.ascii_letters + '_', '0123456789' + contstr, needcont = '', 0 + contline = None + indents = [0] + + while 1: # loop over lines in stream + try: + line = readline() + except StopIteration: + line = '' + lnum = lnum + 1 + pos, max = 0, len(line) + + if contstr: # continued string + if not line: + raise TokenError, ("EOF in multi-line string", strstart) + endmatch = endprog.match(line) + if endmatch: + pos = end = endmatch.end(0) + yield (STRING, contstr + line[:end], + strstart, (lnum, end), contline + line) + contstr, needcont = '', 0 + contline = None + elif needcont and line[-2:] != '\\\n' and line[-3:] != '\\\r\n': + yield (ERRORTOKEN, contstr + line, + strstart, (lnum, len(line)), contline) + contstr = '' + contline = None + continue + else: + contstr = contstr + line + contline = contline + line + continue + + elif parenlev == 0 and not continued: # new statement + if not line: break + column = 0 + while pos < max: # measure leading whitespace + if line[pos] == ' ': column = column + 1 + elif line[pos] == '\t': column = (column//tabsize + 1)*tabsize + elif line[pos] == '\f': column = 0 + else: break + pos = pos + 1 + if pos == max: break + + if line[pos] in '#\r\n': # skip comments or blank lines + if line[pos] == '#': + comment_token = line[pos:].rstrip('\r\n') + nl_pos = pos + len(comment_token) + yield (COMMENT, comment_token, + (lnum, pos), (lnum, pos + len(comment_token)), line) + yield (NL, line[nl_pos:], + (lnum, nl_pos), (lnum, len(line)), line) + else: + yield ((NL, COMMENT)[line[pos] == '#'], line[pos:], + (lnum, pos), (lnum, len(line)), line) + continue + + if column > indents[-1]: # count indents or dedents + indents.append(column) + yield (INDENT, line[:pos], (lnum, 0), (lnum, pos), line) + while column < indents[-1]: + if column not in indents: + raise IndentationError( + "unindent does not match any outer indentation level", + ("", lnum, pos, line)) + indents = indents[:-1] + yield (DEDENT, '', (lnum, pos), (lnum, pos), line) + + else: # continued statement + if not line: + raise TokenError, ("EOF in multi-line statement", (lnum, 0)) + continued = 0 + + while pos < max: + pseudomatch = pseudoprog.match(line, pos) + if pseudomatch: # scan for tokens + start, end = pseudomatch.span(1) + spos, epos, pos = (lnum, start), (lnum, end), end + token, initial = line[start:end], line[start] + + if initial in numchars or \ + (initial == '.' and token != '.'): # ordinary number + yield (NUMBER, token, spos, epos, line) + elif initial in '\r\n': + newline = NEWLINE + if parenlev > 0: + newline = NL + yield (newline, token, spos, epos, line) + elif initial == '#': + assert not token.endswith("\n") + yield (COMMENT, token, spos, epos, line) + elif token in triple_quoted: + endprog = endprogs[token] + endmatch = endprog.match(line, pos) + if endmatch: # all on one line + pos = endmatch.end(0) + token = line[start:pos] + yield (STRING, token, spos, (lnum, pos), line) + else: + strstart = (lnum, start) # multiple lines + contstr = line[start:] + contline = line + break + elif initial in single_quoted or \ + token[:2] in single_quoted or \ + token[:3] in single_quoted: + if token[-1] == '\n': # continued string + strstart = (lnum, start) + endprog = (endprogs[initial] or endprogs[token[1]] or + endprogs[token[2]]) + contstr, needcont = line[start:], 1 + contline = line + break + else: # ordinary string + yield (STRING, token, spos, epos, line) + elif initial in namechars: # ordinary name + yield (NAME, token, spos, epos, line) + elif initial == '\\': # continued stmt + # This yield is new; needed for better idempotency: + yield (NL, token, spos, (lnum, pos), line) + continued = 1 + else: + if initial in '([{': parenlev = parenlev + 1 + elif initial in ')]}': parenlev = parenlev - 1 + yield (OP, token, spos, epos, line) + else: + yield (ERRORTOKEN, line[pos], + (lnum, pos), (lnum, pos+1), line) + pos = pos + 1 + + for indent in indents[1:]: # pop remaining indent levels + yield (DEDENT, '', (lnum, 0), (lnum, 0), '') + yield (ENDMARKER, '', (lnum, 0), (lnum, 0), '') + +if __name__ == '__main__': # testing + import sys + if len(sys.argv) > 1: tokenize(open(sys.argv[1]).readline) + else: tokenize(sys.stdin.readline) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pygram.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pygram.py new file mode 100644 index 000000000000..9f036a018561 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pygram.py @@ -0,0 +1,38 @@ +# Copyright 2006 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Export the Python grammar and symbols.""" + +# Python imports +import os + +# Local imports +from .pgen2 import driver + +# The grammar file +_GRAMMAR_FILE = os.path.join(os.path.dirname(__file__), "Grammar.txt") +_PATTERN_GRAMMAR_FILE = os.path.join(os.path.dirname(__file__), + "PatternGrammar.txt") + + +class Symbols(object): + + def __init__(self, grammar): + """Initializer. + + Creates an attribute for each grammar symbol (nonterminal), + whose value is the symbol's type (an int >= 256). + """ + for name, symbol in grammar.symbol2number.iteritems(): + setattr(self, name, symbol) + + +python_grammar = driver.load_grammar(_GRAMMAR_FILE) + +python_symbols = Symbols(python_grammar) + +python_grammar_no_print_statement = python_grammar.copy() +del python_grammar_no_print_statement.keywords["print"] + +pattern_grammar = driver.load_grammar(_PATTERN_GRAMMAR_FILE) +pattern_symbols = Symbols(pattern_grammar) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pytree.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pytree.py new file mode 100644 index 000000000000..179caca51f29 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pytree.py @@ -0,0 +1,887 @@ +# Copyright 2006 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +""" +Python parse tree definitions. + +This is a very concrete parse tree; we need to keep every token and +even the comments and whitespace between tokens. + +There's also a pattern matching implementation here. +""" + +__author__ = "Guido van Rossum " + +import sys +import warnings +from StringIO import StringIO + +HUGE = 0x7FFFFFFF # maximum repeat count, default max + +_type_reprs = {} +def type_repr(type_num): + global _type_reprs + if not _type_reprs: + from .pygram import python_symbols + # printing tokens is possible but not as useful + # from .pgen2 import token // token.__dict__.items(): + for name, val in python_symbols.__dict__.items(): + if type(val) == int: _type_reprs[val] = name + return _type_reprs.setdefault(type_num, type_num) + +class Base(object): + + """ + Abstract base class for Node and Leaf. + + This provides some default functionality and boilerplate using the + template pattern. + + A node may be a subnode of at most one parent. + """ + + # Default values for instance variables + type = None # int: token number (< 256) or symbol number (>= 256) + parent = None # Parent node pointer, or None + children = () # Tuple of subnodes + was_changed = False + was_checked = False + + def __new__(cls, *args, **kwds): + """Constructor that prevents Base from being instantiated.""" + assert cls is not Base, "Cannot instantiate Base" + return object.__new__(cls) + + def __eq__(self, other): + """ + Compare two nodes for equality. + + This calls the method _eq(). + """ + if self.__class__ is not other.__class__: + return NotImplemented + return self._eq(other) + + __hash__ = None # For Py3 compatibility. + + def __ne__(self, other): + """ + Compare two nodes for inequality. + + This calls the method _eq(). + """ + if self.__class__ is not other.__class__: + return NotImplemented + return not self._eq(other) + + def _eq(self, other): + """ + Compare two nodes for equality. + + This is called by __eq__ and __ne__. It is only called if the two nodes + have the same type. This must be implemented by the concrete subclass. + Nodes should be considered equal if they have the same structure, + ignoring the prefix string and other context information. + """ + raise NotImplementedError + + def clone(self): + """ + Return a cloned (deep) copy of self. + + This must be implemented by the concrete subclass. + """ + raise NotImplementedError + + def post_order(self): + """ + Return a post-order iterator for the tree. + + This must be implemented by the concrete subclass. + """ + raise NotImplementedError + + def pre_order(self): + """ + Return a pre-order iterator for the tree. + + This must be implemented by the concrete subclass. + """ + raise NotImplementedError + + def set_prefix(self, prefix): + """ + Set the prefix for the node (see Leaf class). + + DEPRECATED; use the prefix property directly. + """ + warnings.warn("set_prefix() is deprecated; use the prefix property", + DeprecationWarning, stacklevel=2) + self.prefix = prefix + + def get_prefix(self): + """ + Return the prefix for the node (see Leaf class). + + DEPRECATED; use the prefix property directly. + """ + warnings.warn("get_prefix() is deprecated; use the prefix property", + DeprecationWarning, stacklevel=2) + return self.prefix + + def replace(self, new): + """Replace this node with a new one in the parent.""" + assert self.parent is not None, str(self) + assert new is not None + if not isinstance(new, list): + new = [new] + l_children = [] + found = False + for ch in self.parent.children: + if ch is self: + assert not found, (self.parent.children, self, new) + if new is not None: + l_children.extend(new) + found = True + else: + l_children.append(ch) + assert found, (self.children, self, new) + self.parent.changed() + self.parent.children = l_children + for x in new: + x.parent = self.parent + self.parent = None + + def get_lineno(self): + """Return the line number which generated the invocant node.""" + node = self + while not isinstance(node, Leaf): + if not node.children: + return + node = node.children[0] + return node.lineno + + def changed(self): + if self.parent: + self.parent.changed() + self.was_changed = True + + def remove(self): + """ + Remove the node from the tree. Returns the position of the node in its + parent's children before it was removed. + """ + if self.parent: + for i, node in enumerate(self.parent.children): + if node is self: + self.parent.changed() + del self.parent.children[i] + self.parent = None + return i + + @property + def next_sibling(self): + """ + The node immediately following the invocant in their parent's children + list. If the invocant does not have a next sibling, it is None + """ + if self.parent is None: + return None + + # Can't use index(); we need to test by identity + for i, child in enumerate(self.parent.children): + if child is self: + try: + return self.parent.children[i+1] + except IndexError: + return None + + @property + def prev_sibling(self): + """ + The node immediately preceding the invocant in their parent's children + list. If the invocant does not have a previous sibling, it is None. + """ + if self.parent is None: + return None + + # Can't use index(); we need to test by identity + for i, child in enumerate(self.parent.children): + if child is self: + if i == 0: + return None + return self.parent.children[i-1] + + def leaves(self): + for child in self.children: + for x in child.leaves(): + yield x + + def depth(self): + if self.parent is None: + return 0 + return 1 + self.parent.depth() + + def get_suffix(self): + """ + Return the string immediately following the invocant node. This is + effectively equivalent to node.next_sibling.prefix + """ + next_sib = self.next_sibling + if next_sib is None: + return u"" + return next_sib.prefix + + if sys.version_info < (3, 0): + def __str__(self): + return unicode(self).encode("ascii") + +class Node(Base): + + """Concrete implementation for interior nodes.""" + + def __init__(self,type, children, + context=None, + prefix=None, + fixers_applied=None): + """ + Initializer. + + Takes a type constant (a symbol number >= 256), a sequence of + child nodes, and an optional context keyword argument. + + As a side effect, the parent pointers of the children are updated. + """ + assert type >= 256, type + self.type = type + self.children = list(children) + for ch in self.children: + assert ch.parent is None, repr(ch) + ch.parent = self + if prefix is not None: + self.prefix = prefix + if fixers_applied: + self.fixers_applied = fixers_applied[:] + else: + self.fixers_applied = None + + def __repr__(self): + """Return a canonical string representation.""" + return "%s(%s, %r)" % (self.__class__.__name__, + type_repr(self.type), + self.children) + + def __unicode__(self): + """ + Return a pretty string representation. + + This reproduces the input source exactly. + """ + return u"".join(map(unicode, self.children)) + + if sys.version_info > (3, 0): + __str__ = __unicode__ + + def _eq(self, other): + """Compare two nodes for equality.""" + return (self.type, self.children) == (other.type, other.children) + + def clone(self): + """Return a cloned (deep) copy of self.""" + return Node(self.type, [ch.clone() for ch in self.children], + fixers_applied=self.fixers_applied) + + def post_order(self): + """Return a post-order iterator for the tree.""" + for child in self.children: + for node in child.post_order(): + yield node + yield self + + def pre_order(self): + """Return a pre-order iterator for the tree.""" + yield self + for child in self.children: + for node in child.pre_order(): + yield node + + def _prefix_getter(self): + """ + The whitespace and comments preceding this node in the input. + """ + if not self.children: + return "" + return self.children[0].prefix + + def _prefix_setter(self, prefix): + if self.children: + self.children[0].prefix = prefix + + prefix = property(_prefix_getter, _prefix_setter) + + def set_child(self, i, child): + """ + Equivalent to 'node.children[i] = child'. This method also sets the + child's parent attribute appropriately. + """ + child.parent = self + self.children[i].parent = None + self.children[i] = child + self.changed() + + def insert_child(self, i, child): + """ + Equivalent to 'node.children.insert(i, child)'. This method also sets + the child's parent attribute appropriately. + """ + child.parent = self + self.children.insert(i, child) + self.changed() + + def append_child(self, child): + """ + Equivalent to 'node.children.append(child)'. This method also sets the + child's parent attribute appropriately. + """ + child.parent = self + self.children.append(child) + self.changed() + + +class Leaf(Base): + + """Concrete implementation for leaf nodes.""" + + # Default values for instance variables + _prefix = "" # Whitespace and comments preceding this token in the input + lineno = 0 # Line where this token starts in the input + column = 0 # Column where this token tarts in the input + + def __init__(self, type, value, + context=None, + prefix=None, + fixers_applied=[]): + """ + Initializer. + + Takes a type constant (a token number < 256), a string value, and an + optional context keyword argument. + """ + assert 0 <= type < 256, type + if context is not None: + self._prefix, (self.lineno, self.column) = context + self.type = type + self.value = value + if prefix is not None: + self._prefix = prefix + self.fixers_applied = fixers_applied[:] + + def __repr__(self): + """Return a canonical string representation.""" + return "%s(%r, %r)" % (self.__class__.__name__, + self.type, + self.value) + + def __unicode__(self): + """ + Return a pretty string representation. + + This reproduces the input source exactly. + """ + return self.prefix + unicode(self.value) + + if sys.version_info > (3, 0): + __str__ = __unicode__ + + def _eq(self, other): + """Compare two nodes for equality.""" + return (self.type, self.value) == (other.type, other.value) + + def clone(self): + """Return a cloned (deep) copy of self.""" + return Leaf(self.type, self.value, + (self.prefix, (self.lineno, self.column)), + fixers_applied=self.fixers_applied) + + def leaves(self): + yield self + + def post_order(self): + """Return a post-order iterator for the tree.""" + yield self + + def pre_order(self): + """Return a pre-order iterator for the tree.""" + yield self + + def _prefix_getter(self): + """ + The whitespace and comments preceding this token in the input. + """ + return self._prefix + + def _prefix_setter(self, prefix): + self.changed() + self._prefix = prefix + + prefix = property(_prefix_getter, _prefix_setter) + +def convert(gr, raw_node): + """ + Convert raw node information to a Node or Leaf instance. + + This is passed to the parser driver which calls it whenever a reduction of a + grammar rule produces a new complete node, so that the tree is build + strictly bottom-up. + """ + type, value, context, children = raw_node + if children or type in gr.number2symbol: + # If there's exactly one child, return that child instead of + # creating a new node. + if len(children) == 1: + return children[0] + return Node(type, children, context=context) + else: + return Leaf(type, value, context=context) + + +class BasePattern(object): + + """ + A pattern is a tree matching pattern. + + It looks for a specific node type (token or symbol), and + optionally for a specific content. + + This is an abstract base class. There are three concrete + subclasses: + + - LeafPattern matches a single leaf node; + - NodePattern matches a single node (usually non-leaf); + - WildcardPattern matches a sequence of nodes of variable length. + """ + + # Defaults for instance variables + type = None # Node type (token if < 256, symbol if >= 256) + content = None # Optional content matching pattern + name = None # Optional name used to store match in results dict + + def __new__(cls, *args, **kwds): + """Constructor that prevents BasePattern from being instantiated.""" + assert cls is not BasePattern, "Cannot instantiate BasePattern" + return object.__new__(cls) + + def __repr__(self): + args = [type_repr(self.type), self.content, self.name] + while args and args[-1] is None: + del args[-1] + return "%s(%s)" % (self.__class__.__name__, ", ".join(map(repr, args))) + + def optimize(self): + """ + A subclass can define this as a hook for optimizations. + + Returns either self or another node with the same effect. + """ + return self + + def match(self, node, results=None): + """ + Does this pattern exactly match a node? + + Returns True if it matches, False if not. + + If results is not None, it must be a dict which will be + updated with the nodes matching named subpatterns. + + Default implementation for non-wildcard patterns. + """ + if self.type is not None and node.type != self.type: + return False + if self.content is not None: + r = None + if results is not None: + r = {} + if not self._submatch(node, r): + return False + if r: + results.update(r) + if results is not None and self.name: + results[self.name] = node + return True + + def match_seq(self, nodes, results=None): + """ + Does this pattern exactly match a sequence of nodes? + + Default implementation for non-wildcard patterns. + """ + if len(nodes) != 1: + return False + return self.match(nodes[0], results) + + def generate_matches(self, nodes): + """ + Generator yielding all matches for this pattern. + + Default implementation for non-wildcard patterns. + """ + r = {} + if nodes and self.match(nodes[0], r): + yield 1, r + + +class LeafPattern(BasePattern): + + def __init__(self, type=None, content=None, name=None): + """ + Initializer. Takes optional type, content, and name. + + The type, if given must be a token type (< 256). If not given, + this matches any *leaf* node; the content may still be required. + + The content, if given, must be a string. + + If a name is given, the matching node is stored in the results + dict under that key. + """ + if type is not None: + assert 0 <= type < 256, type + if content is not None: + assert isinstance(content, basestring), repr(content) + self.type = type + self.content = content + self.name = name + + def match(self, node, results=None): + """Override match() to insist on a leaf node.""" + if not isinstance(node, Leaf): + return False + return BasePattern.match(self, node, results) + + def _submatch(self, node, results=None): + """ + Match the pattern's content to the node's children. + + This assumes the node type matches and self.content is not None. + + Returns True if it matches, False if not. + + If results is not None, it must be a dict which will be + updated with the nodes matching named subpatterns. + + When returning False, the results dict may still be updated. + """ + return self.content == node.value + + +class NodePattern(BasePattern): + + wildcards = False + + def __init__(self, type=None, content=None, name=None): + """ + Initializer. Takes optional type, content, and name. + + The type, if given, must be a symbol type (>= 256). If the + type is None this matches *any* single node (leaf or not), + except if content is not None, in which it only matches + non-leaf nodes that also match the content pattern. + + The content, if not None, must be a sequence of Patterns that + must match the node's children exactly. If the content is + given, the type must not be None. + + If a name is given, the matching node is stored in the results + dict under that key. + """ + if type is not None: + assert type >= 256, type + if content is not None: + assert not isinstance(content, basestring), repr(content) + content = list(content) + for i, item in enumerate(content): + assert isinstance(item, BasePattern), (i, item) + if isinstance(item, WildcardPattern): + self.wildcards = True + self.type = type + self.content = content + self.name = name + + def _submatch(self, node, results=None): + """ + Match the pattern's content to the node's children. + + This assumes the node type matches and self.content is not None. + + Returns True if it matches, False if not. + + If results is not None, it must be a dict which will be + updated with the nodes matching named subpatterns. + + When returning False, the results dict may still be updated. + """ + if self.wildcards: + for c, r in generate_matches(self.content, node.children): + if c == len(node.children): + if results is not None: + results.update(r) + return True + return False + if len(self.content) != len(node.children): + return False + for subpattern, child in zip(self.content, node.children): + if not subpattern.match(child, results): + return False + return True + + +class WildcardPattern(BasePattern): + + """ + A wildcard pattern can match zero or more nodes. + + This has all the flexibility needed to implement patterns like: + + .* .+ .? .{m,n} + (a b c | d e | f) + (...)* (...)+ (...)? (...){m,n} + + except it always uses non-greedy matching. + """ + + def __init__(self, content=None, min=0, max=HUGE, name=None): + """ + Initializer. + + Args: + content: optional sequence of subsequences of patterns; + if absent, matches one node; + if present, each subsequence is an alternative [*] + min: optional minimum number of times to match, default 0 + max: optional maximum number of times to match, default HUGE + name: optional name assigned to this match + + [*] Thus, if content is [[a, b, c], [d, e], [f, g, h]] this is + equivalent to (a b c | d e | f g h); if content is None, + this is equivalent to '.' in regular expression terms. + The min and max parameters work as follows: + min=0, max=maxint: .* + min=1, max=maxint: .+ + min=0, max=1: .? + min=1, max=1: . + If content is not None, replace the dot with the parenthesized + list of alternatives, e.g. (a b c | d e | f g h)* + """ + assert 0 <= min <= max <= HUGE, (min, max) + if content is not None: + content = tuple(map(tuple, content)) # Protect against alterations + # Check sanity of alternatives + assert len(content), repr(content) # Can't have zero alternatives + for alt in content: + assert len(alt), repr(alt) # Can have empty alternatives + self.content = content + self.min = min + self.max = max + self.name = name + + def optimize(self): + """Optimize certain stacked wildcard patterns.""" + subpattern = None + if (self.content is not None and + len(self.content) == 1 and len(self.content[0]) == 1): + subpattern = self.content[0][0] + if self.min == 1 and self.max == 1: + if self.content is None: + return NodePattern(name=self.name) + if subpattern is not None and self.name == subpattern.name: + return subpattern.optimize() + if (self.min <= 1 and isinstance(subpattern, WildcardPattern) and + subpattern.min <= 1 and self.name == subpattern.name): + return WildcardPattern(subpattern.content, + self.min*subpattern.min, + self.max*subpattern.max, + subpattern.name) + return self + + def match(self, node, results=None): + """Does this pattern exactly match a node?""" + return self.match_seq([node], results) + + def match_seq(self, nodes, results=None): + """Does this pattern exactly match a sequence of nodes?""" + for c, r in self.generate_matches(nodes): + if c == len(nodes): + if results is not None: + results.update(r) + if self.name: + results[self.name] = list(nodes) + return True + return False + + def generate_matches(self, nodes): + """ + Generator yielding matches for a sequence of nodes. + + Args: + nodes: sequence of nodes + + Yields: + (count, results) tuples where: + count: the match comprises nodes[:count]; + results: dict containing named submatches. + """ + if self.content is None: + # Shortcut for special case (see __init__.__doc__) + for count in xrange(self.min, 1 + min(len(nodes), self.max)): + r = {} + if self.name: + r[self.name] = nodes[:count] + yield count, r + elif self.name == "bare_name": + yield self._bare_name_matches(nodes) + else: + # The reason for this is that hitting the recursion limit usually + # results in some ugly messages about how RuntimeErrors are being + # ignored. We don't do this on non-CPython implementation because + # they don't have this problem. + if hasattr(sys, "getrefcount"): + save_stderr = sys.stderr + sys.stderr = StringIO() + try: + for count, r in self._recursive_matches(nodes, 0): + if self.name: + r[self.name] = nodes[:count] + yield count, r + except RuntimeError: + # We fall back to the iterative pattern matching scheme if the recursive + # scheme hits the recursion limit. + for count, r in self._iterative_matches(nodes): + if self.name: + r[self.name] = nodes[:count] + yield count, r + finally: + if hasattr(sys, "getrefcount"): + sys.stderr = save_stderr + + def _iterative_matches(self, nodes): + """Helper to iteratively yield the matches.""" + nodelen = len(nodes) + if 0 >= self.min: + yield 0, {} + + results = [] + # generate matches that use just one alt from self.content + for alt in self.content: + for c, r in generate_matches(alt, nodes): + yield c, r + results.append((c, r)) + + # for each match, iterate down the nodes + while results: + new_results = [] + for c0, r0 in results: + # stop if the entire set of nodes has been matched + if c0 < nodelen and c0 <= self.max: + for alt in self.content: + for c1, r1 in generate_matches(alt, nodes[c0:]): + if c1 > 0: + r = {} + r.update(r0) + r.update(r1) + yield c0 + c1, r + new_results.append((c0 + c1, r)) + results = new_results + + def _bare_name_matches(self, nodes): + """Special optimized matcher for bare_name.""" + count = 0 + r = {} + done = False + max = len(nodes) + while not done and count < max: + done = True + for leaf in self.content: + if leaf[0].match(nodes[count], r): + count += 1 + done = False + break + r[self.name] = nodes[:count] + return count, r + + def _recursive_matches(self, nodes, count): + """Helper to recursively yield the matches.""" + assert self.content is not None + if count >= self.min: + yield 0, {} + if count < self.max: + for alt in self.content: + for c0, r0 in generate_matches(alt, nodes): + for c1, r1 in self._recursive_matches(nodes[c0:], count+1): + r = {} + r.update(r0) + r.update(r1) + yield c0 + c1, r + + +class NegatedPattern(BasePattern): + + def __init__(self, content=None): + """ + Initializer. + + The argument is either a pattern or None. If it is None, this + only matches an empty sequence (effectively '$' in regex + lingo). If it is not None, this matches whenever the argument + pattern doesn't have any matches. + """ + if content is not None: + assert isinstance(content, BasePattern), repr(content) + self.content = content + + def match(self, node): + # We never match a node in its entirety + return False + + def match_seq(self, nodes): + # We only match an empty sequence of nodes in its entirety + return len(nodes) == 0 + + def generate_matches(self, nodes): + if self.content is None: + # Return a match if there is an empty sequence + if len(nodes) == 0: + yield 0, {} + else: + # Return a match if the argument pattern has no matches + for c, r in self.content.generate_matches(nodes): + return + yield 0, {} + + +def generate_matches(patterns, nodes): + """ + Generator yielding matches for a sequence of patterns and nodes. + + Args: + patterns: a sequence of patterns + nodes: a sequence of nodes + + Yields: + (count, results) tuples where: + count: the entire sequence of patterns matches nodes[:count]; + results: dict containing named submatches. + """ + if not patterns: + yield 0, {} + else: + p, rest = patterns[0], patterns[1:] + for c0, r0 in p.generate_matches(nodes): + if not rest: + yield c0, r0 + else: + for c1, r1 in generate_matches(rest, nodes[c0:]): + r = {} + r.update(r0) + r.update(r1) + yield c0 + c1, r diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/refactor.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/refactor.py new file mode 100644 index 000000000000..a657d872e864 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/refactor.py @@ -0,0 +1,746 @@ +# Copyright 2006 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Refactoring framework. + +Used as a main program, this can refactor any number of files and/or +recursively descend down directories. Imported as a module, this +provides infrastructure to write your own refactoring tool. +""" + +from __future__ import with_statement + +__author__ = "Guido van Rossum " + + +# Python imports +import os +import sys +import logging +import operator +import collections +import StringIO +from itertools import chain + +# Local imports +from .pgen2 import driver, tokenize, token +from .fixer_util import find_root +from . import pytree, pygram +from . import btm_matcher as bm + + +def get_all_fix_names(fixer_pkg, remove_prefix=True): + """Return a sorted list of all available fix names in the given package.""" + pkg = __import__(fixer_pkg, [], [], ["*"]) + fixer_dir = os.path.dirname(pkg.__file__) + fix_names = [] + for name in sorted(os.listdir(fixer_dir)): + if name.startswith("fix_") and name.endswith(".py"): + if remove_prefix: + name = name[4:] + fix_names.append(name[:-3]) + return fix_names + + +class _EveryNode(Exception): + pass + + +def _get_head_types(pat): + """ Accepts a pytree Pattern Node and returns a set + of the pattern types which will match first. """ + + if isinstance(pat, (pytree.NodePattern, pytree.LeafPattern)): + # NodePatters must either have no type and no content + # or a type and content -- so they don't get any farther + # Always return leafs + if pat.type is None: + raise _EveryNode + return set([pat.type]) + + if isinstance(pat, pytree.NegatedPattern): + if pat.content: + return _get_head_types(pat.content) + raise _EveryNode # Negated Patterns don't have a type + + if isinstance(pat, pytree.WildcardPattern): + # Recurse on each node in content + r = set() + for p in pat.content: + for x in p: + r.update(_get_head_types(x)) + return r + + raise Exception("Oh no! I don't understand pattern %s" %(pat)) + + +def _get_headnode_dict(fixer_list): + """ Accepts a list of fixers and returns a dictionary + of head node type --> fixer list. """ + head_nodes = collections.defaultdict(list) + every = [] + for fixer in fixer_list: + if fixer.pattern: + try: + heads = _get_head_types(fixer.pattern) + except _EveryNode: + every.append(fixer) + else: + for node_type in heads: + head_nodes[node_type].append(fixer) + else: + if fixer._accept_type is not None: + head_nodes[fixer._accept_type].append(fixer) + else: + every.append(fixer) + for node_type in chain(pygram.python_grammar.symbol2number.itervalues(), + pygram.python_grammar.tokens): + head_nodes[node_type].extend(every) + return dict(head_nodes) + + +def get_fixers_from_package(pkg_name): + """ + Return the fully qualified names for fixers in the package pkg_name. + """ + return [pkg_name + "." + fix_name + for fix_name in get_all_fix_names(pkg_name, False)] + +def _identity(obj): + return obj + +if sys.version_info < (3, 0): + import codecs + _open_with_encoding = codecs.open + # codecs.open doesn't translate newlines sadly. + def _from_system_newlines(input): + return input.replace(u"\r\n", u"\n") + def _to_system_newlines(input): + if os.linesep != "\n": + return input.replace(u"\n", os.linesep) + else: + return input +else: + _open_with_encoding = open + _from_system_newlines = _identity + _to_system_newlines = _identity + + +def _detect_future_features(source): + have_docstring = False + gen = tokenize.generate_tokens(StringIO.StringIO(source).readline) + def advance(): + tok = gen.next() + return tok[0], tok[1] + ignore = frozenset((token.NEWLINE, tokenize.NL, token.COMMENT)) + features = set() + try: + while True: + tp, value = advance() + if tp in ignore: + continue + elif tp == token.STRING: + if have_docstring: + break + have_docstring = True + elif tp == token.NAME and value == u"from": + tp, value = advance() + if tp != token.NAME or value != u"__future__": + break + tp, value = advance() + if tp != token.NAME or value != u"import": + break + tp, value = advance() + if tp == token.OP and value == u"(": + tp, value = advance() + while tp == token.NAME: + features.add(value) + tp, value = advance() + if tp != token.OP or value != u",": + break + tp, value = advance() + else: + break + except StopIteration: + pass + return frozenset(features) + + +class FixerError(Exception): + """A fixer could not be loaded.""" + + +class RefactoringTool(object): + + _default_options = {"print_function" : False, + "write_unchanged_files" : False} + + CLASS_PREFIX = "Fix" # The prefix for fixer classes + FILE_PREFIX = "fix_" # The prefix for modules with a fixer within + + def __init__(self, fixer_names, options=None, explicit=None): + """Initializer. + + Args: + fixer_names: a list of fixers to import + options: an dict with configuration. + explicit: a list of fixers to run even if they are explicit. + """ + self.fixers = fixer_names + self.explicit = explicit or [] + self.options = self._default_options.copy() + if options is not None: + self.options.update(options) + if self.options["print_function"]: + self.grammar = pygram.python_grammar_no_print_statement + else: + self.grammar = pygram.python_grammar + # When this is True, the refactor*() methods will call write_file() for + # files processed even if they were not changed during refactoring. If + # and only if the refactor method's write parameter was True. + self.write_unchanged_files = self.options.get("write_unchanged_files") + self.errors = [] + self.logger = logging.getLogger("RefactoringTool") + self.fixer_log = [] + self.wrote = False + self.driver = driver.Driver(self.grammar, + convert=pytree.convert, + logger=self.logger) + self.pre_order, self.post_order = self.get_fixers() + + + self.files = [] # List of files that were or should be modified + + self.BM = bm.BottomMatcher() + self.bmi_pre_order = [] # Bottom Matcher incompatible fixers + self.bmi_post_order = [] + + for fixer in chain(self.post_order, self.pre_order): + if fixer.BM_compatible: + self.BM.add_fixer(fixer) + # remove fixers that will be handled by the bottom-up + # matcher + elif fixer in self.pre_order: + self.bmi_pre_order.append(fixer) + elif fixer in self.post_order: + self.bmi_post_order.append(fixer) + + self.bmi_pre_order_heads = _get_headnode_dict(self.bmi_pre_order) + self.bmi_post_order_heads = _get_headnode_dict(self.bmi_post_order) + + + + def get_fixers(self): + """Inspects the options to load the requested patterns and handlers. + + Returns: + (pre_order, post_order), where pre_order is the list of fixers that + want a pre-order AST traversal, and post_order is the list that want + post-order traversal. + """ + pre_order_fixers = [] + post_order_fixers = [] + for fix_mod_path in self.fixers: + mod = __import__(fix_mod_path, {}, {}, ["*"]) + fix_name = fix_mod_path.rsplit(".", 1)[-1] + if fix_name.startswith(self.FILE_PREFIX): + fix_name = fix_name[len(self.FILE_PREFIX):] + parts = fix_name.split("_") + class_name = self.CLASS_PREFIX + "".join([p.title() for p in parts]) + try: + fix_class = getattr(mod, class_name) + except AttributeError: + raise FixerError("Can't find %s.%s" % (fix_name, class_name)) + fixer = fix_class(self.options, self.fixer_log) + if fixer.explicit and self.explicit is not True and \ + fix_mod_path not in self.explicit: + self.log_message("Skipping implicit fixer: %s", fix_name) + continue + + self.log_debug("Adding transformation: %s", fix_name) + if fixer.order == "pre": + pre_order_fixers.append(fixer) + elif fixer.order == "post": + post_order_fixers.append(fixer) + else: + raise FixerError("Illegal fixer order: %r" % fixer.order) + + key_func = operator.attrgetter("run_order") + pre_order_fixers.sort(key=key_func) + post_order_fixers.sort(key=key_func) + return (pre_order_fixers, post_order_fixers) + + def log_error(self, msg, *args, **kwds): + """Called when an error occurs.""" + raise + + def log_message(self, msg, *args): + """Hook to log a message.""" + if args: + msg = msg % args + self.logger.info(msg) + + def log_debug(self, msg, *args): + if args: + msg = msg % args + self.logger.debug(msg) + + def print_output(self, old_text, new_text, filename, equal): + """Called with the old version, new version, and filename of a + refactored file.""" + pass + + def refactor(self, items, write=False, doctests_only=False): + """Refactor a list of files and directories.""" + + for dir_or_file in items: + if os.path.isdir(dir_or_file): + self.refactor_dir(dir_or_file, write, doctests_only) + else: + self.refactor_file(dir_or_file, write, doctests_only) + + def refactor_dir(self, dir_name, write=False, doctests_only=False): + """Descends down a directory and refactor every Python file found. + + Python files are assumed to have a .py extension. + + Files and subdirectories starting with '.' are skipped. + """ + py_ext = os.extsep + "py" + for dirpath, dirnames, filenames in os.walk(dir_name): + self.log_debug("Descending into %s", dirpath) + dirnames.sort() + filenames.sort() + for name in filenames: + if (not name.startswith(".") and + os.path.splitext(name)[1] == py_ext): + fullname = os.path.join(dirpath, name) + self.refactor_file(fullname, write, doctests_only) + # Modify dirnames in-place to remove subdirs with leading dots + dirnames[:] = [dn for dn in dirnames if not dn.startswith(".")] + + def _read_python_source(self, filename): + """ + Do our best to decode a Python source file correctly. + """ + try: + f = open(filename, "rb") + except IOError as err: + self.log_error("Can't open %s: %s", filename, err) + return None, None + try: + encoding = tokenize.detect_encoding(f.readline)[0] + finally: + f.close() + with _open_with_encoding(filename, "r", encoding=encoding) as f: + return _from_system_newlines(f.read()), encoding + + def refactor_file(self, filename, write=False, doctests_only=False): + """Refactors a file.""" + input, encoding = self._read_python_source(filename) + if input is None: + # Reading the file failed. + return + input += u"\n" # Silence certain parse errors + if doctests_only: + self.log_debug("Refactoring doctests in %s", filename) + output = self.refactor_docstring(input, filename) + if self.write_unchanged_files or output != input: + self.processed_file(output, filename, input, write, encoding) + else: + self.log_debug("No doctest changes in %s", filename) + else: + tree = self.refactor_string(input, filename) + if self.write_unchanged_files or (tree and tree.was_changed): + # The [:-1] is to take off the \n we added earlier + self.processed_file(unicode(tree)[:-1], filename, + write=write, encoding=encoding) + else: + self.log_debug("No changes in %s", filename) + + def refactor_string(self, data, name): + """Refactor a given input string. + + Args: + data: a string holding the code to be refactored. + name: a human-readable name for use in error/log messages. + + Returns: + An AST corresponding to the refactored input stream; None if + there were errors during the parse. + """ + features = _detect_future_features(data) + if "print_function" in features: + self.driver.grammar = pygram.python_grammar_no_print_statement + try: + tree = self.driver.parse_string(data) + except Exception as err: + self.log_error("Can't parse %s: %s: %s", + name, err.__class__.__name__, err) + return + finally: + self.driver.grammar = self.grammar + tree.future_features = features + self.log_debug("Refactoring %s", name) + self.refactor_tree(tree, name) + return tree + + def refactor_stdin(self, doctests_only=False): + input = sys.stdin.read() + if doctests_only: + self.log_debug("Refactoring doctests in stdin") + output = self.refactor_docstring(input, "") + if self.write_unchanged_files or output != input: + self.processed_file(output, "", input) + else: + self.log_debug("No doctest changes in stdin") + else: + tree = self.refactor_string(input, "") + if self.write_unchanged_files or (tree and tree.was_changed): + self.processed_file(unicode(tree), "", input) + else: + self.log_debug("No changes in stdin") + + def refactor_tree(self, tree, name): + """Refactors a parse tree (modifying the tree in place). + + For compatible patterns the bottom matcher module is + used. Otherwise the tree is traversed node-to-node for + matches. + + Args: + tree: a pytree.Node instance representing the root of the tree + to be refactored. + name: a human-readable name for this tree. + + Returns: + True if the tree was modified, False otherwise. + """ + + for fixer in chain(self.pre_order, self.post_order): + fixer.start_tree(tree, name) + + #use traditional matching for the incompatible fixers + self.traverse_by(self.bmi_pre_order_heads, tree.pre_order()) + self.traverse_by(self.bmi_post_order_heads, tree.post_order()) + + # obtain a set of candidate nodes + match_set = self.BM.run(tree.leaves()) + + while any(match_set.values()): + for fixer in self.BM.fixers: + if fixer in match_set and match_set[fixer]: + #sort by depth; apply fixers from bottom(of the AST) to top + match_set[fixer].sort(key=pytree.Base.depth, reverse=True) + + if fixer.keep_line_order: + #some fixers(eg fix_imports) must be applied + #with the original file's line order + match_set[fixer].sort(key=pytree.Base.get_lineno) + + for node in list(match_set[fixer]): + if node in match_set[fixer]: + match_set[fixer].remove(node) + + try: + find_root(node) + except ValueError: + # this node has been cut off from a + # previous transformation ; skip + continue + + if node.fixers_applied and fixer in node.fixers_applied: + # do not apply the same fixer again + continue + + results = fixer.match(node) + + if results: + new = fixer.transform(node, results) + if new is not None: + node.replace(new) + #new.fixers_applied.append(fixer) + for node in new.post_order(): + # do not apply the fixer again to + # this or any subnode + if not node.fixers_applied: + node.fixers_applied = [] + node.fixers_applied.append(fixer) + + # update the original match set for + # the added code + new_matches = self.BM.run(new.leaves()) + for fxr in new_matches: + if not fxr in match_set: + match_set[fxr]=[] + + match_set[fxr].extend(new_matches[fxr]) + + for fixer in chain(self.pre_order, self.post_order): + fixer.finish_tree(tree, name) + return tree.was_changed + + def traverse_by(self, fixers, traversal): + """Traverse an AST, applying a set of fixers to each node. + + This is a helper method for refactor_tree(). + + Args: + fixers: a list of fixer instances. + traversal: a generator that yields AST nodes. + + Returns: + None + """ + if not fixers: + return + for node in traversal: + for fixer in fixers[node.type]: + results = fixer.match(node) + if results: + new = fixer.transform(node, results) + if new is not None: + node.replace(new) + node = new + + def processed_file(self, new_text, filename, old_text=None, write=False, + encoding=None): + """ + Called when a file has been refactored and there may be changes. + """ + self.files.append(filename) + if old_text is None: + old_text = self._read_python_source(filename)[0] + if old_text is None: + return + equal = old_text == new_text + self.print_output(old_text, new_text, filename, equal) + if equal: + self.log_debug("No changes to %s", filename) + if not self.write_unchanged_files: + return + if write: + self.write_file(new_text, filename, old_text, encoding) + else: + self.log_debug("Not writing changes to %s", filename) + + def write_file(self, new_text, filename, old_text, encoding=None): + """Writes a string to a file. + + It first shows a unified diff between the old text and the new text, and + then rewrites the file; the latter is only done if the write option is + set. + """ + try: + f = _open_with_encoding(filename, "w", encoding=encoding) + except os.error as err: + self.log_error("Can't create %s: %s", filename, err) + return + try: + f.write(_to_system_newlines(new_text)) + except os.error as err: + self.log_error("Can't write %s: %s", filename, err) + finally: + f.close() + self.log_debug("Wrote changes to %s", filename) + self.wrote = True + + PS1 = ">>> " + PS2 = "... " + + def refactor_docstring(self, input, filename): + """Refactors a docstring, looking for doctests. + + This returns a modified version of the input string. It looks + for doctests, which start with a ">>>" prompt, and may be + continued with "..." prompts, as long as the "..." is indented + the same as the ">>>". + + (Unfortunately we can't use the doctest module's parser, + since, like most parsers, it is not geared towards preserving + the original source.) + """ + result = [] + block = None + block_lineno = None + indent = None + lineno = 0 + for line in input.splitlines(True): + lineno += 1 + if line.lstrip().startswith(self.PS1): + if block is not None: + result.extend(self.refactor_doctest(block, block_lineno, + indent, filename)) + block_lineno = lineno + block = [line] + i = line.find(self.PS1) + indent = line[:i] + elif (indent is not None and + (line.startswith(indent + self.PS2) or + line == indent + self.PS2.rstrip() + u"\n")): + block.append(line) + else: + if block is not None: + result.extend(self.refactor_doctest(block, block_lineno, + indent, filename)) + block = None + indent = None + result.append(line) + if block is not None: + result.extend(self.refactor_doctest(block, block_lineno, + indent, filename)) + return u"".join(result) + + def refactor_doctest(self, block, lineno, indent, filename): + """Refactors one doctest. + + A doctest is given as a block of lines, the first of which starts + with ">>>" (possibly indented), while the remaining lines start + with "..." (identically indented). + + """ + try: + tree = self.parse_block(block, lineno, indent) + except Exception as err: + if self.logger.isEnabledFor(logging.DEBUG): + for line in block: + self.log_debug("Source: %s", line.rstrip(u"\n")) + self.log_error("Can't parse docstring in %s line %s: %s: %s", + filename, lineno, err.__class__.__name__, err) + return block + if self.refactor_tree(tree, filename): + new = unicode(tree).splitlines(True) + # Undo the adjustment of the line numbers in wrap_toks() below. + clipped, new = new[:lineno-1], new[lineno-1:] + assert clipped == [u"\n"] * (lineno-1), clipped + if not new[-1].endswith(u"\n"): + new[-1] += u"\n" + block = [indent + self.PS1 + new.pop(0)] + if new: + block += [indent + self.PS2 + line for line in new] + return block + + def summarize(self): + if self.wrote: + were = "were" + else: + were = "need to be" + if not self.files: + self.log_message("No files %s modified.", were) + else: + self.log_message("Files that %s modified:", were) + for file in self.files: + self.log_message(file) + if self.fixer_log: + self.log_message("Warnings/messages while refactoring:") + for message in self.fixer_log: + self.log_message(message) + if self.errors: + if len(self.errors) == 1: + self.log_message("There was 1 error:") + else: + self.log_message("There were %d errors:", len(self.errors)) + for msg, args, kwds in self.errors: + self.log_message(msg, *args, **kwds) + + def parse_block(self, block, lineno, indent): + """Parses a block into a tree. + + This is necessary to get correct line number / offset information + in the parser diagnostics and embedded into the parse tree. + """ + tree = self.driver.parse_tokens(self.wrap_toks(block, lineno, indent)) + tree.future_features = frozenset() + return tree + + def wrap_toks(self, block, lineno, indent): + """Wraps a tokenize stream to systematically modify start/end.""" + tokens = tokenize.generate_tokens(self.gen_lines(block, indent).next) + for type, value, (line0, col0), (line1, col1), line_text in tokens: + line0 += lineno - 1 + line1 += lineno - 1 + # Don't bother updating the columns; this is too complicated + # since line_text would also have to be updated and it would + # still break for tokens spanning lines. Let the user guess + # that the column numbers for doctests are relative to the + # end of the prompt string (PS1 or PS2). + yield type, value, (line0, col0), (line1, col1), line_text + + + def gen_lines(self, block, indent): + """Generates lines as expected by tokenize from a list of lines. + + This strips the first len(indent + self.PS1) characters off each line. + """ + prefix1 = indent + self.PS1 + prefix2 = indent + self.PS2 + prefix = prefix1 + for line in block: + if line.startswith(prefix): + yield line[len(prefix):] + elif line == prefix.rstrip() + u"\n": + yield u"\n" + else: + raise AssertionError("line=%r, prefix=%r" % (line, prefix)) + prefix = prefix2 + while True: + yield "" + + +class MultiprocessingUnsupported(Exception): + pass + + +class MultiprocessRefactoringTool(RefactoringTool): + + def __init__(self, *args, **kwargs): + super(MultiprocessRefactoringTool, self).__init__(*args, **kwargs) + self.queue = None + self.output_lock = None + + def refactor(self, items, write=False, doctests_only=False, + num_processes=1): + if num_processes == 1: + return super(MultiprocessRefactoringTool, self).refactor( + items, write, doctests_only) + try: + import multiprocessing + except ImportError: + raise MultiprocessingUnsupported + if self.queue is not None: + raise RuntimeError("already doing multiple processes") + self.queue = multiprocessing.JoinableQueue() + self.output_lock = multiprocessing.Lock() + processes = [multiprocessing.Process(target=self._child) + for i in xrange(num_processes)] + try: + for p in processes: + p.start() + super(MultiprocessRefactoringTool, self).refactor(items, write, + doctests_only) + finally: + self.queue.join() + for i in xrange(num_processes): + self.queue.put(None) + for p in processes: + if p.is_alive(): + p.join() + self.queue = None + + def _child(self): + task = self.queue.get() + while task is not None: + args, kwargs = task + try: + super(MultiprocessRefactoringTool, self).refactor_file( + *args, **kwargs) + finally: + self.queue.task_done() + task = self.queue.get() + + def refactor_file(self, *args, **kwargs): + if self.queue is not None: + self.queue.put((args, kwargs)) + else: + return super(MultiprocessRefactoringTool, self).refactor_file( + *args, **kwargs) diff --git a/python/helpers/pydev/third_party/pep8/pep8.py b/python/helpers/pydev/third_party/pep8/pep8.py new file mode 100644 index 000000000000..d907066d1822 --- /dev/null +++ b/python/helpers/pydev/third_party/pep8/pep8.py @@ -0,0 +1,1959 @@ +#!/usr/bin/env python +# pep8.py - Check Python source code formatting, according to PEP 8 +# Copyright (C) 2006-2009 Johann C. Rocholl +# Copyright (C) 2009-2014 Florent Xicluna +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +r""" +Check Python source code formatting, according to PEP 8. + +For usage and a list of options, try this: +$ python pep8.py -h + +This program and its regression test suite live here: +http://github.com/jcrocholl/pep8 + +Groups of errors and warnings: +E errors +W warnings +100 indentation +200 whitespace +300 blank lines +400 imports +500 line length +600 deprecation +700 statements +900 syntax error +""" +from __future__ import with_statement + +__version__ = '1.6.0a0' + +import os +import sys +import re +import time +import inspect +import keyword +import tokenize +from optparse import OptionParser +from fnmatch import fnmatch +try: + from configparser import RawConfigParser + from io import TextIOWrapper +except ImportError: + from ConfigParser import RawConfigParser + +DEFAULT_EXCLUDE = '.svn,CVS,.bzr,.hg,.git,__pycache__' +DEFAULT_IGNORE = 'E123,E226,E24,E704' +if sys.platform == 'win32': + DEFAULT_CONFIG = os.path.expanduser(r'~\.pep8') +else: + DEFAULT_CONFIG = os.path.join(os.getenv('XDG_CONFIG_HOME') or + os.path.expanduser('~/.config'), 'pep8') +PROJECT_CONFIG = ('setup.cfg', 'tox.ini', '.pep8') +TESTSUITE_PATH = os.path.join(os.path.dirname(__file__), 'testsuite') +MAX_LINE_LENGTH = 79 +REPORT_FORMAT = { + 'default': '%(path)s:%(row)d:%(col)d: %(code)s %(text)s', + 'pylint': '%(path)s:%(row)d: [%(code)s] %(text)s', +} + +PyCF_ONLY_AST = 1024 +SINGLETONS = frozenset(['False', 'None', 'True']) +KEYWORDS = frozenset(keyword.kwlist + ['print']) - SINGLETONS +UNARY_OPERATORS = frozenset(['>>', '**', '*', '+', '-']) +ARITHMETIC_OP = frozenset(['**', '*', '/', '//', '+', '-']) +WS_OPTIONAL_OPERATORS = ARITHMETIC_OP.union(['^', '&', '|', '<<', '>>', '%']) +WS_NEEDED_OPERATORS = frozenset([ + '**=', '*=', '/=', '//=', '+=', '-=', '!=', '<>', '<', '>', + '%=', '^=', '&=', '|=', '==', '<=', '>=', '<<=', '>>=', '=']) +WHITESPACE = frozenset(' \t') +NEWLINE = frozenset([tokenize.NL, tokenize.NEWLINE]) +SKIP_TOKENS = NEWLINE.union([tokenize.INDENT, tokenize.DEDENT]) +# ERRORTOKEN is triggered by backticks in Python 3 +SKIP_COMMENTS = SKIP_TOKENS.union([tokenize.COMMENT, tokenize.ERRORTOKEN]) +BENCHMARK_KEYS = ['directories', 'files', 'logical lines', 'physical lines'] + +INDENT_REGEX = re.compile(r'([ \t]*)') +RAISE_COMMA_REGEX = re.compile(r'raise\s+\w+\s*,') +RERAISE_COMMA_REGEX = re.compile(r'raise\s+\w+\s*,.*,\s*\w+\s*$') +ERRORCODE_REGEX = re.compile(r'\b[A-Z]\d{3}\b') +DOCSTRING_REGEX = re.compile(r'u?r?["\']') +EXTRANEOUS_WHITESPACE_REGEX = re.compile(r'[[({] | []}),;:]') +WHITESPACE_AFTER_COMMA_REGEX = re.compile(r'[,;:]\s*(?: |\t)') +COMPARE_SINGLETON_REGEX = re.compile(r'([=!]=)\s*(None|False|True)') +COMPARE_NEGATIVE_REGEX = re.compile(r'\b(not)\s+[^[({ ]+\s+(in|is)\s') +COMPARE_TYPE_REGEX = re.compile(r'(?:[=!]=|is(?:\s+not)?)\s*type(?:s.\w+Type' + r'|\s*\(\s*([^)]*[^ )])\s*\))') +KEYWORD_REGEX = re.compile(r'(\s*)\b(?:%s)\b(\s*)' % r'|'.join(KEYWORDS)) +OPERATOR_REGEX = re.compile(r'(?:[^,\s])(\s*)(?:[-+*/|!<=>%&^]+)(\s*)') +LAMBDA_REGEX = re.compile(r'\blambda\b') +HUNK_REGEX = re.compile(r'^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@.*$') + +# Work around Python < 2.6 behaviour, which does not generate NL after +# a comment which is on a line by itself. +COMMENT_WITH_NL = tokenize.generate_tokens(['#\n'].pop).send(None)[1] == '#\n' + + +############################################################################## +# Plugins (check functions) for physical lines +############################################################################## + + +def tabs_or_spaces(physical_line, indent_char): + r"""Never mix tabs and spaces. + + The most popular way of indenting Python is with spaces only. The + second-most popular way is with tabs only. Code indented with a mixture + of tabs and spaces should be converted to using spaces exclusively. When + invoking the Python command line interpreter with the -t option, it issues + warnings about code that illegally mixes tabs and spaces. When using -tt + these warnings become errors. These options are highly recommended! + + Okay: if a == 0:\n a = 1\n b = 1 + E101: if a == 0:\n a = 1\n\tb = 1 + """ + indent = INDENT_REGEX.match(physical_line).group(1) + for offset, char in enumerate(indent): + if char != indent_char: + return offset, "E101 indentation contains mixed spaces and tabs" + + +def tabs_obsolete(physical_line): + r"""For new projects, spaces-only are strongly recommended over tabs. + + Okay: if True:\n return + W191: if True:\n\treturn + """ + indent = INDENT_REGEX.match(physical_line).group(1) + if '\t' in indent: + return indent.index('\t'), "W191 indentation contains tabs" + + +def trailing_whitespace(physical_line): + r"""Trailing whitespace is superfluous. + + The warning returned varies on whether the line itself is blank, for easier + filtering for those who want to indent their blank lines. + + Okay: spam(1)\n# + W291: spam(1) \n# + W293: class Foo(object):\n \n bang = 12 + """ + physical_line = physical_line.rstrip('\n') # chr(10), newline + physical_line = physical_line.rstrip('\r') # chr(13), carriage return + physical_line = physical_line.rstrip('\x0c') # chr(12), form feed, ^L + stripped = physical_line.rstrip(' \t\v') + if physical_line != stripped: + if stripped: + return len(stripped), "W291 trailing whitespace" + else: + return 0, "W293 blank line contains whitespace" + + +def trailing_blank_lines(physical_line, lines, line_number, total_lines): + r"""Trailing blank lines are superfluous. + + Okay: spam(1) + W391: spam(1)\n + + However the last line should end with a new line (warning W292). + """ + if line_number == total_lines: + stripped_last_line = physical_line.rstrip() + if not stripped_last_line: + return 0, "W391 blank line at end of file" + if stripped_last_line == physical_line: + return len(physical_line), "W292 no newline at end of file" + + +def maximum_line_length(physical_line, max_line_length, multiline): + r"""Limit all lines to a maximum of 79 characters. + + There are still many devices around that are limited to 80 character + lines; plus, limiting windows to 80 characters makes it possible to have + several windows side-by-side. The default wrapping on such devices looks + ugly. Therefore, please limit all lines to a maximum of 79 characters. + For flowing long blocks of text (docstrings or comments), limiting the + length to 72 characters is recommended. + + Reports error E501. + """ + line = physical_line.rstrip() + length = len(line) + if length > max_line_length and not noqa(line): + # Special case for long URLs in multi-line docstrings or comments, + # but still report the error when the 72 first chars are whitespaces. + chunks = line.split() + if ((len(chunks) == 1 and multiline) or + (len(chunks) == 2 and chunks[0] == '#')) and \ + len(line) - len(chunks[-1]) < max_line_length - 7: + return + if hasattr(line, 'decode'): # Python 2 + # The line could contain multi-byte characters + try: + length = len(line.decode('utf-8')) + except UnicodeError: + pass + if length > max_line_length: + return (max_line_length, "E501 line too long " + "(%d > %d characters)" % (length, max_line_length)) + + +############################################################################## +# Plugins (check functions) for logical lines +############################################################################## + + +def blank_lines(logical_line, blank_lines, indent_level, line_number, + blank_before, previous_logical, previous_indent_level): + r"""Separate top-level function and class definitions with two blank lines. + + Method definitions inside a class are separated by a single blank line. + + Extra blank lines may be used (sparingly) to separate groups of related + functions. Blank lines may be omitted between a bunch of related + one-liners (e.g. a set of dummy implementations). + + Use blank lines in functions, sparingly, to indicate logical sections. + + Okay: def a():\n pass\n\n\ndef b():\n pass + Okay: def a():\n pass\n\n\n# Foo\n# Bar\n\ndef b():\n pass + + E301: class Foo:\n b = 0\n def bar():\n pass + E302: def a():\n pass\n\ndef b(n):\n pass + E303: def a():\n pass\n\n\n\ndef b(n):\n pass + E303: def a():\n\n\n\n pass + E304: @decorator\n\ndef a():\n pass + """ + if line_number < 3 and not previous_logical: + return # Don't expect blank lines before the first line + if previous_logical.startswith('@'): + if blank_lines: + yield 0, "E304 blank lines found after function decorator" + elif blank_lines > 2 or (indent_level and blank_lines == 2): + yield 0, "E303 too many blank lines (%d)" % blank_lines + elif logical_line.startswith(('def ', 'class ', '@')): + if indent_level: + if not (blank_before or previous_indent_level < indent_level or + DOCSTRING_REGEX.match(previous_logical)): + yield 0, "E301 expected 1 blank line, found 0" + elif blank_before != 2: + yield 0, "E302 expected 2 blank lines, found %d" % blank_before + + +def extraneous_whitespace(logical_line): + r"""Avoid extraneous whitespace. + + Avoid extraneous whitespace in these situations: + - Immediately inside parentheses, brackets or braces. + - Immediately before a comma, semicolon, or colon. + + Okay: spam(ham[1], {eggs: 2}) + E201: spam( ham[1], {eggs: 2}) + E201: spam(ham[ 1], {eggs: 2}) + E201: spam(ham[1], { eggs: 2}) + E202: spam(ham[1], {eggs: 2} ) + E202: spam(ham[1 ], {eggs: 2}) + E202: spam(ham[1], {eggs: 2 }) + + E203: if x == 4: print x, y; x, y = y , x + E203: if x == 4: print x, y ; x, y = y, x + E203: if x == 4 : print x, y; x, y = y, x + """ + line = logical_line + for match in EXTRANEOUS_WHITESPACE_REGEX.finditer(line): + text = match.group() + char = text.strip() + found = match.start() + if text == char + ' ': + # assert char in '([{' + yield found + 1, "E201 whitespace after '%s'" % char + elif line[found - 1] != ',': + code = ('E202' if char in '}])' else 'E203') # if char in ',;:' + yield found, "%s whitespace before '%s'" % (code, char) + + +def whitespace_around_keywords(logical_line): + r"""Avoid extraneous whitespace around keywords. + + Okay: True and False + E271: True and False + E272: True and False + E273: True and\tFalse + E274: True\tand False + """ + for match in KEYWORD_REGEX.finditer(logical_line): + before, after = match.groups() + + if '\t' in before: + yield match.start(1), "E274 tab before keyword" + elif len(before) > 1: + yield match.start(1), "E272 multiple spaces before keyword" + + if '\t' in after: + yield match.start(2), "E273 tab after keyword" + elif len(after) > 1: + yield match.start(2), "E271 multiple spaces after keyword" + + +def missing_whitespace(logical_line): + r"""Each comma, semicolon or colon should be followed by whitespace. + + Okay: [a, b] + Okay: (3,) + Okay: a[1:4] + Okay: a[:4] + Okay: a[1:] + Okay: a[1:4:2] + E231: ['a','b'] + E231: foo(bar,baz) + E231: [{'a':'b'}] + """ + line = logical_line + for index in range(len(line) - 1): + char = line[index] + if char in ',;:' and line[index + 1] not in WHITESPACE: + before = line[:index] + if char == ':' and before.count('[') > before.count(']') and \ + before.rfind('{') < before.rfind('['): + continue # Slice syntax, no space required + if char == ',' and line[index + 1] == ')': + continue # Allow tuple with only one element: (3,) + yield index, "E231 missing whitespace after '%s'" % char + + +def indentation(logical_line, previous_logical, indent_char, + indent_level, previous_indent_level): + r"""Use 4 spaces per indentation level. + + For really old code that you don't want to mess up, you can continue to + use 8-space tabs. + + Okay: a = 1 + Okay: if a == 0:\n a = 1 + E111: a = 1 + E114: # a = 1 + + Okay: for item in items:\n pass + E112: for item in items:\npass + E115: for item in items:\n# Hi\n pass + + Okay: a = 1\nb = 2 + E113: a = 1\n b = 2 + E116: a = 1\n # b = 2 + """ + c = 0 if logical_line else 3 + tmpl = "E11%d %s" if logical_line else "E11%d %s (comment)" + if indent_level % 4: + yield 0, tmpl % (1 + c, "indentation is not a multiple of four") + indent_expect = previous_logical.endswith(':') + if indent_expect and indent_level <= previous_indent_level: + yield 0, tmpl % (2 + c, "expected an indented block") + elif not indent_expect and indent_level > previous_indent_level: + yield 0, tmpl % (3 + c, "unexpected indentation") + + +def continued_indentation(logical_line, tokens, indent_level, hang_closing, + indent_char, noqa, verbose): + r"""Continuation lines indentation. + + Continuation lines should align wrapped elements either vertically + using Python's implicit line joining inside parentheses, brackets + and braces, or using a hanging indent. + + When using a hanging indent these considerations should be applied: + - there should be no arguments on the first line, and + - further indentation should be used to clearly distinguish itself as a + continuation line. + + Okay: a = (\n) + E123: a = (\n ) + + Okay: a = (\n 42) + E121: a = (\n 42) + E122: a = (\n42) + E123: a = (\n 42\n ) + E124: a = (24,\n 42\n) + E125: if (\n b):\n pass + E126: a = (\n 42) + E127: a = (24,\n 42) + E128: a = (24,\n 42) + E129: if (a or\n b):\n pass + E131: a = (\n 42\n 24) + """ + first_row = tokens[0][2][0] + nrows = 1 + tokens[-1][2][0] - first_row + if noqa or nrows == 1: + return + + # indent_next tells us whether the next block is indented; assuming + # that it is indented by 4 spaces, then we should not allow 4-space + # indents on the final continuation line; in turn, some other + # indents are allowed to have an extra 4 spaces. + indent_next = logical_line.endswith(':') + + row = depth = 0 + valid_hangs = (4,) if indent_char != '\t' else (4, 8) + # remember how many brackets were opened on each line + parens = [0] * nrows + # relative indents of physical lines + rel_indent = [0] * nrows + # for each depth, collect a list of opening rows + open_rows = [[0]] + # for each depth, memorize the hanging indentation + hangs = [None] + # visual indents + indent_chances = {} + last_indent = tokens[0][2] + visual_indent = None + # for each depth, memorize the visual indent column + indent = [last_indent[1]] + if verbose >= 3: + print(">>> " + tokens[0][4].rstrip()) + + for token_type, text, start, end, line in tokens: + + newline = row < start[0] - first_row + if newline: + row = start[0] - first_row + newline = not last_token_multiline and token_type not in NEWLINE + + if newline: + # this is the beginning of a continuation line. + last_indent = start + if verbose >= 3: + print("... " + line.rstrip()) + + # record the initial indent. + rel_indent[row] = expand_indent(line) - indent_level + + # identify closing bracket + close_bracket = (token_type == tokenize.OP and text in ']})') + + # is the indent relative to an opening bracket line? + for open_row in reversed(open_rows[depth]): + hang = rel_indent[row] - rel_indent[open_row] + hanging_indent = hang in valid_hangs + if hanging_indent: + break + if hangs[depth]: + hanging_indent = (hang == hangs[depth]) + # is there any chance of visual indent? + visual_indent = (not close_bracket and hang > 0 and + indent_chances.get(start[1])) + + if close_bracket and indent[depth]: + # closing bracket for visual indent + if start[1] != indent[depth]: + yield (start, "E124 closing bracket does not match " + "visual indentation") + elif close_bracket and not hang: + # closing bracket matches indentation of opening bracket's line + if hang_closing: + yield start, "E133 closing bracket is missing indentation" + elif indent[depth] and start[1] < indent[depth]: + if visual_indent is not True: + # visual indent is broken + yield (start, "E128 continuation line " + "under-indented for visual indent") + elif hanging_indent or (indent_next and rel_indent[row] == 8): + # hanging indent is verified + if close_bracket and not hang_closing: + yield (start, "E123 closing bracket does not match " + "indentation of opening bracket's line") + hangs[depth] = hang + elif visual_indent is True: + # visual indent is verified + indent[depth] = start[1] + elif visual_indent in (text, str): + # ignore token lined up with matching one from a previous line + pass + else: + # indent is broken + if hang <= 0: + error = "E122", "missing indentation or outdented" + elif indent[depth]: + error = "E127", "over-indented for visual indent" + elif not close_bracket and hangs[depth]: + error = "E131", "unaligned for hanging indent" + else: + hangs[depth] = hang + if hang > 4: + error = "E126", "over-indented for hanging indent" + else: + error = "E121", "under-indented for hanging indent" + yield start, "%s continuation line %s" % error + + # look for visual indenting + if (parens[row] and token_type not in (tokenize.NL, tokenize.COMMENT) + and not indent[depth]): + indent[depth] = start[1] + indent_chances[start[1]] = True + if verbose >= 4: + print("bracket depth %s indent to %s" % (depth, start[1])) + # deal with implicit string concatenation + elif (token_type in (tokenize.STRING, tokenize.COMMENT) or + text in ('u', 'ur', 'b', 'br')): + indent_chances[start[1]] = str + # special case for the "if" statement because len("if (") == 4 + elif not indent_chances and not row and not depth and text == 'if': + indent_chances[end[1] + 1] = True + elif text == ':' and line[end[1]:].isspace(): + open_rows[depth].append(row) + + # keep track of bracket depth + if token_type == tokenize.OP: + if text in '([{': + depth += 1 + indent.append(0) + hangs.append(None) + if len(open_rows) == depth: + open_rows.append([]) + open_rows[depth].append(row) + parens[row] += 1 + if verbose >= 4: + print("bracket depth %s seen, col %s, visual min = %s" % + (depth, start[1], indent[depth])) + elif text in ')]}' and depth > 0: + # parent indents should not be more than this one + prev_indent = indent.pop() or last_indent[1] + hangs.pop() + for d in range(depth): + if indent[d] > prev_indent: + indent[d] = 0 + for ind in list(indent_chances): + if ind >= prev_indent: + del indent_chances[ind] + del open_rows[depth + 1:] + depth -= 1 + if depth: + indent_chances[indent[depth]] = True + for idx in range(row, -1, -1): + if parens[idx]: + parens[idx] -= 1 + break + assert len(indent) == depth + 1 + if start[1] not in indent_chances: + # allow to line up tokens + indent_chances[start[1]] = text + + last_token_multiline = (start[0] != end[0]) + if last_token_multiline: + rel_indent[end[0] - first_row] = rel_indent[row] + + if indent_next and expand_indent(line) == indent_level + 4: + pos = (start[0], indent[0] + 4) + if visual_indent: + code = "E129 visually indented line" + else: + code = "E125 continuation line" + yield pos, "%s with same indent as next logical line" % code + + +def whitespace_before_parameters(logical_line, tokens): + r"""Avoid extraneous whitespace. + + Avoid extraneous whitespace in the following situations: + - before the open parenthesis that starts the argument list of a + function call. + - before the open parenthesis that starts an indexing or slicing. + + Okay: spam(1) + E211: spam (1) + + Okay: dict['key'] = list[index] + E211: dict ['key'] = list[index] + E211: dict['key'] = list [index] + """ + prev_type, prev_text, __, prev_end, __ = tokens[0] + for index in range(1, len(tokens)): + token_type, text, start, end, __ = tokens[index] + if (token_type == tokenize.OP and + text in '([' and + start != prev_end and + (prev_type == tokenize.NAME or prev_text in '}])') and + # Syntax "class A (B):" is allowed, but avoid it + (index < 2 or tokens[index - 2][1] != 'class') and + # Allow "return (a.foo for a in range(5))" + not keyword.iskeyword(prev_text)): + yield prev_end, "E211 whitespace before '%s'" % text + prev_type = token_type + prev_text = text + prev_end = end + + +def whitespace_around_operator(logical_line): + r"""Avoid extraneous whitespace around an operator. + + Okay: a = 12 + 3 + E221: a = 4 + 5 + E222: a = 4 + 5 + E223: a = 4\t+ 5 + E224: a = 4 +\t5 + """ + for match in OPERATOR_REGEX.finditer(logical_line): + before, after = match.groups() + + if '\t' in before: + yield match.start(1), "E223 tab before operator" + elif len(before) > 1: + yield match.start(1), "E221 multiple spaces before operator" + + if '\t' in after: + yield match.start(2), "E224 tab after operator" + elif len(after) > 1: + yield match.start(2), "E222 multiple spaces after operator" + + +def missing_whitespace_around_operator(logical_line, tokens): + r"""Surround operators with a single space on either side. + + - Always surround these binary operators with a single space on + either side: assignment (=), augmented assignment (+=, -= etc.), + comparisons (==, <, >, !=, <=, >=, in, not in, is, is not), + Booleans (and, or, not). + + - If operators with different priorities are used, consider adding + whitespace around the operators with the lowest priorities. + + Okay: i = i + 1 + Okay: submitted += 1 + Okay: x = x * 2 - 1 + Okay: hypot2 = x * x + y * y + Okay: c = (a + b) * (a - b) + Okay: foo(bar, key='word', *args, **kwargs) + Okay: alpha[:-i] + + E225: i=i+1 + E225: submitted +=1 + E225: x = x /2 - 1 + E225: z = x **y + E226: c = (a+b) * (a-b) + E226: hypot2 = x*x + y*y + E227: c = a|b + E228: msg = fmt%(errno, errmsg) + """ + parens = 0 + need_space = False + prev_type = tokenize.OP + prev_text = prev_end = None + for token_type, text, start, end, line in tokens: + if token_type in SKIP_COMMENTS: + continue + if text in ('(', 'lambda'): + parens += 1 + elif text == ')': + parens -= 1 + if need_space: + if start != prev_end: + # Found a (probably) needed space + if need_space is not True and not need_space[1]: + yield (need_space[0], + "E225 missing whitespace around operator") + need_space = False + elif text == '>' and prev_text in ('<', '-'): + # Tolerate the "<>" operator, even if running Python 3 + # Deal with Python 3's annotated return value "->" + pass + else: + if need_space is True or need_space[1]: + # A needed trailing space was not found + yield prev_end, "E225 missing whitespace around operator" + else: + code, optype = 'E226', 'arithmetic' + if prev_text == '%': + code, optype = 'E228', 'modulo' + elif prev_text not in ARITHMETIC_OP: + code, optype = 'E227', 'bitwise or shift' + yield (need_space[0], "%s missing whitespace " + "around %s operator" % (code, optype)) + need_space = False + elif token_type == tokenize.OP and prev_end is not None: + if text == '=' and parens: + # Allow keyword args or defaults: foo(bar=None). + pass + elif text in WS_NEEDED_OPERATORS: + need_space = True + elif text in UNARY_OPERATORS: + # Check if the operator is being used as a binary operator + # Allow unary operators: -123, -x, +1. + # Allow argument unpacking: foo(*args, **kwargs). + if (prev_text in '}])' if prev_type == tokenize.OP + else prev_text not in KEYWORDS): + need_space = None + elif text in WS_OPTIONAL_OPERATORS: + need_space = None + + if need_space is None: + # Surrounding space is optional, but ensure that + # trailing space matches opening space + need_space = (prev_end, start != prev_end) + elif need_space and start == prev_end: + # A needed opening space was not found + yield prev_end, "E225 missing whitespace around operator" + need_space = False + prev_type = token_type + prev_text = text + prev_end = end + + +def whitespace_around_comma(logical_line): + r"""Avoid extraneous whitespace after a comma or a colon. + + Note: these checks are disabled by default + + Okay: a = (1, 2) + E241: a = (1, 2) + E242: a = (1,\t2) + """ + line = logical_line + for m in WHITESPACE_AFTER_COMMA_REGEX.finditer(line): + found = m.start() + 1 + if '\t' in m.group(): + yield found, "E242 tab after '%s'" % m.group()[0] + else: + yield found, "E241 multiple spaces after '%s'" % m.group()[0] + + +def whitespace_around_named_parameter_equals(logical_line, tokens): + r"""Don't use spaces around the '=' sign in function arguments. + + Don't use spaces around the '=' sign when used to indicate a + keyword argument or a default parameter value. + + Okay: def complex(real, imag=0.0): + Okay: return magic(r=real, i=imag) + Okay: boolean(a == b) + Okay: boolean(a != b) + Okay: boolean(a <= b) + Okay: boolean(a >= b) + + E251: def complex(real, imag = 0.0): + E251: return magic(r = real, i = imag) + """ + parens = 0 + no_space = False + prev_end = None + message = "E251 unexpected spaces around keyword / parameter equals" + for token_type, text, start, end, line in tokens: + if token_type == tokenize.NL: + continue + if no_space: + no_space = False + if start != prev_end: + yield (prev_end, message) + elif token_type == tokenize.OP: + if text == '(': + parens += 1 + elif text == ')': + parens -= 1 + elif parens and text == '=': + no_space = True + if start != prev_end: + yield (prev_end, message) + prev_end = end + + +def whitespace_before_comment(logical_line, tokens): + r"""Separate inline comments by at least two spaces. + + An inline comment is a comment on the same line as a statement. Inline + comments should be separated by at least two spaces from the statement. + They should start with a # and a single space. + + Each line of a block comment starts with a # and a single space + (unless it is indented text inside the comment). + + Okay: x = x + 1 # Increment x + Okay: x = x + 1 # Increment x + Okay: # Block comment + E261: x = x + 1 # Increment x + E262: x = x + 1 #Increment x + E262: x = x + 1 # Increment x + E265: #Block comment + E266: ### Block comment + """ + prev_end = (0, 0) + for token_type, text, start, end, line in tokens: + if token_type == tokenize.COMMENT: + inline_comment = line[:start[1]].strip() + if inline_comment: + if prev_end[0] == start[0] and start[1] < prev_end[1] + 2: + yield (prev_end, + "E261 at least two spaces before inline comment") + symbol, sp, comment = text.partition(' ') + bad_prefix = symbol not in '#:' and (symbol.lstrip('#')[:1] or '#') + if inline_comment: + if bad_prefix or comment[:1] in WHITESPACE: + yield start, "E262 inline comment should start with '# '" + elif bad_prefix and (bad_prefix != '!' or start[0] > 1): + if bad_prefix != '#': + yield start, "E265 block comment should start with '# '" + elif comment: + yield start, "E266 too many leading '#' for block comment" + elif token_type != tokenize.NL: + prev_end = end + + +def imports_on_separate_lines(logical_line): + r"""Imports should usually be on separate lines. + + Okay: import os\nimport sys + E401: import sys, os + + Okay: from subprocess import Popen, PIPE + Okay: from myclas import MyClass + Okay: from foo.bar.yourclass import YourClass + Okay: import myclass + Okay: import foo.bar.yourclass + """ + line = logical_line + if line.startswith('import '): + found = line.find(',') + if -1 < found and ';' not in line[:found]: + yield found, "E401 multiple imports on one line" + + +def compound_statements(logical_line): + r"""Compound statements (on the same line) are generally discouraged. + + While sometimes it's okay to put an if/for/while with a small body + on the same line, never do this for multi-clause statements. + Also avoid folding such long lines! + + Always use a def statement instead of an assignment statement that + binds a lambda expression directly to a name. + + Okay: if foo == 'blah':\n do_blah_thing() + Okay: do_one() + Okay: do_two() + Okay: do_three() + + E701: if foo == 'blah': do_blah_thing() + E701: for x in lst: total += x + E701: while t < 10: t = delay() + E701: if foo == 'blah': do_blah_thing() + E701: else: do_non_blah_thing() + E701: try: something() + E701: finally: cleanup() + E701: if foo == 'blah': one(); two(); three() + E702: do_one(); do_two(); do_three() + E703: do_four(); # useless semicolon + E704: def f(x): return 2*x + E731: f = lambda x: 2*x + """ + line = logical_line + last_char = len(line) - 1 + found = line.find(':') + while -1 < found < last_char: + before = line[:found] + if ((before.count('{') <= before.count('}') and # {'a': 1} (dict) + before.count('[') <= before.count(']') and # [1:2] (slice) + before.count('(') <= before.count(')'))): # (annotation) + if LAMBDA_REGEX.search(before): + yield 0, "E731 do not assign a lambda expression, use a def" + break + if before.startswith('def '): + yield 0, "E704 multiple statements on one line (def)" + else: + yield found, "E701 multiple statements on one line (colon)" + found = line.find(':', found + 1) + found = line.find(';') + while -1 < found: + if found < last_char: + yield found, "E702 multiple statements on one line (semicolon)" + else: + yield found, "E703 statement ends with a semicolon" + found = line.find(';', found + 1) + + +def explicit_line_join(logical_line, tokens): + r"""Avoid explicit line join between brackets. + + The preferred way of wrapping long lines is by using Python's implied line + continuation inside parentheses, brackets and braces. Long lines can be + broken over multiple lines by wrapping expressions in parentheses. These + should be used in preference to using a backslash for line continuation. + + E502: aaa = [123, \\n 123] + E502: aaa = ("bbb " \\n "ccc") + + Okay: aaa = [123,\n 123] + Okay: aaa = ("bbb "\n "ccc") + Okay: aaa = "bbb " \\n "ccc" + """ + prev_start = prev_end = parens = 0 + for token_type, text, start, end, line in tokens: + if start[0] != prev_start and parens and backslash: + yield backslash, "E502 the backslash is redundant between brackets" + if end[0] != prev_end: + if line.rstrip('\r\n').endswith('\\'): + backslash = (end[0], len(line.splitlines()[-1]) - 1) + else: + backslash = None + prev_start = prev_end = end[0] + else: + prev_start = start[0] + if token_type == tokenize.OP: + if text in '([{': + parens += 1 + elif text in ')]}': + parens -= 1 + + +def comparison_to_singleton(logical_line, noqa): + r"""Comparison to singletons should use "is" or "is not". + + Comparisons to singletons like None should always be done + with "is" or "is not", never the equality operators. + + Okay: if arg is not None: + E711: if arg != None: + E712: if arg == True: + + Also, beware of writing if x when you really mean if x is not None -- + e.g. when testing whether a variable or argument that defaults to None was + set to some other value. The other value might have a type (such as a + container) that could be false in a boolean context! + """ + match = not noqa and COMPARE_SINGLETON_REGEX.search(logical_line) + if match: + same = (match.group(1) == '==') + singleton = match.group(2) + msg = "'if cond is %s:'" % (('' if same else 'not ') + singleton) + if singleton in ('None',): + code = 'E711' + else: + code = 'E712' + nonzero = ((singleton == 'True' and same) or + (singleton == 'False' and not same)) + msg += " or 'if %scond:'" % ('' if nonzero else 'not ') + yield match.start(1), ("%s comparison to %s should be %s" % + (code, singleton, msg)) + + +def comparison_negative(logical_line): + r"""Negative comparison should be done using "not in" and "is not". + + Okay: if x not in y:\n pass + Okay: assert (X in Y or X is Z) + Okay: if not (X in Y):\n pass + Okay: zz = x is not y + E713: Z = not X in Y + E713: if not X.B in Y:\n pass + E714: if not X is Y:\n pass + E714: Z = not X.B is Y + """ + match = COMPARE_NEGATIVE_REGEX.search(logical_line) + if match: + pos = match.start(1) + if match.group(2) == 'in': + yield pos, "E713 test for membership should be 'not in'" + else: + yield pos, "E714 test for object identity should be 'is not'" + + +def comparison_type(logical_line): + r"""Object type comparisons should always use isinstance(). + + Do not compare types directly. + + Okay: if isinstance(obj, int): + E721: if type(obj) is type(1): + + When checking if an object is a string, keep in mind that it might be a + unicode string too! In Python 2.3, str and unicode have a common base + class, basestring, so you can do: + + Okay: if isinstance(obj, basestring): + Okay: if type(a1) is type(b1): + """ + match = COMPARE_TYPE_REGEX.search(logical_line) + if match: + inst = match.group(1) + if inst and isidentifier(inst) and inst not in SINGLETONS: + return # Allow comparison for types which are not obvious + yield match.start(), "E721 do not compare types, use 'isinstance()'" + + +def python_3000_has_key(logical_line, noqa): + r"""The {}.has_key() method is removed in Python 3: use the 'in' operator. + + Okay: if "alph" in d:\n print d["alph"] + W601: assert d.has_key('alph') + """ + pos = logical_line.find('.has_key(') + if pos > -1 and not noqa: + yield pos, "W601 .has_key() is deprecated, use 'in'" + + +def python_3000_raise_comma(logical_line): + r"""When raising an exception, use "raise ValueError('message')". + + The older form is removed in Python 3. + + Okay: raise DummyError("Message") + W602: raise DummyError, "Message" + """ + match = RAISE_COMMA_REGEX.match(logical_line) + if match and not RERAISE_COMMA_REGEX.match(logical_line): + yield match.end() - 1, "W602 deprecated form of raising exception" + + +def python_3000_not_equal(logical_line): + r"""New code should always use != instead of <>. + + The older syntax is removed in Python 3. + + Okay: if a != 'no': + W603: if a <> 'no': + """ + pos = logical_line.find('<>') + if pos > -1: + yield pos, "W603 '<>' is deprecated, use '!='" + + +def python_3000_backticks(logical_line): + r"""Backticks are removed in Python 3: use repr() instead. + + Okay: val = repr(1 + 2) + W604: val = `1 + 2` + """ + pos = logical_line.find('`') + if pos > -1: + yield pos, "W604 backticks are deprecated, use 'repr()'" + + +############################################################################## +# Helper functions +############################################################################## + + +if '' == ''.encode(): + # Python 2: implicit encoding. + def readlines(filename): + """Read the source code.""" + with open(filename, 'rU') as f: + return f.readlines() + isidentifier = re.compile(r'[a-zA-Z_]\w*').match + stdin_get_value = sys.stdin.read +else: + # Python 3 + def readlines(filename): + """Read the source code.""" + try: + with open(filename, 'rb') as f: + (coding, lines) = tokenize.detect_encoding(f.readline) + f = TextIOWrapper(f, coding, line_buffering=True) + return [l.decode(coding) for l in lines] + f.readlines() + except (LookupError, SyntaxError, UnicodeError): + # Fall back if file encoding is improperly declared + with open(filename, encoding='latin-1') as f: + return f.readlines() + isidentifier = str.isidentifier + + def stdin_get_value(): + return TextIOWrapper(sys.stdin.buffer, errors='ignore').read() +noqa = re.compile(r'# no(?:qa|pep8)\b', re.I).search + + +def expand_indent(line): + r"""Return the amount of indentation. + + Tabs are expanded to the next multiple of 8. + + >>> expand_indent(' ') + 4 + >>> expand_indent('\t') + 8 + >>> expand_indent(' \t') + 8 + >>> expand_indent(' \t') + 16 + """ + if '\t' not in line: + return len(line) - len(line.lstrip()) + result = 0 + for char in line: + if char == '\t': + result = result // 8 * 8 + 8 + elif char == ' ': + result += 1 + else: + break + return result + + +def mute_string(text): + """Replace contents with 'xxx' to prevent syntax matching. + + >>> mute_string('"abc"') + '"xxx"' + >>> mute_string("'''abc'''") + "'''xxx'''" + >>> mute_string("r'abc'") + "r'xxx'" + """ + # String modifiers (e.g. u or r) + start = text.index(text[-1]) + 1 + end = len(text) - 1 + # Triple quotes + if text[-3:] in ('"""', "'''"): + start += 2 + end -= 2 + return text[:start] + 'x' * (end - start) + text[end:] + + +def parse_udiff(diff, patterns=None, parent='.'): + """Return a dictionary of matching lines.""" + # For each file of the diff, the entry key is the filename, + # and the value is a set of row numbers to consider. + rv = {} + path = nrows = None + for line in diff.splitlines(): + if nrows: + if line[:1] != '-': + nrows -= 1 + continue + if line[:3] == '@@ ': + hunk_match = HUNK_REGEX.match(line) + (row, nrows) = [int(g or '1') for g in hunk_match.groups()] + rv[path].update(range(row, row + nrows)) + elif line[:3] == '+++': + path = line[4:].split('\t', 1)[0] + if path[:2] == 'b/': + path = path[2:] + rv[path] = set() + return dict([(os.path.join(parent, path), rows) + for (path, rows) in rv.items() + if rows and filename_match(path, patterns)]) + + +def normalize_paths(value, parent=os.curdir): + """Parse a comma-separated list of paths. + + Return a list of absolute paths. + """ + if not value or isinstance(value, list): + return value + paths = [] + for path in value.split(','): + if '/' in path: + path = os.path.abspath(os.path.join(parent, path)) + paths.append(path.rstrip('/')) + return paths + + +def filename_match(filename, patterns, default=True): + """Check if patterns contains a pattern that matches filename. + + If patterns is unspecified, this always returns True. + """ + if not patterns: + return default + return any(fnmatch(filename, pattern) for pattern in patterns) + + +if COMMENT_WITH_NL: + def _is_eol_token(token): + return (token[0] in NEWLINE or + (token[0] == tokenize.COMMENT and token[1] == token[4])) +else: + def _is_eol_token(token): + return token[0] in NEWLINE + + +############################################################################## +# Framework to run all checks +############################################################################## + + +_checks = {'physical_line': {}, 'logical_line': {}, 'tree': {}} + + +def register_check(check, codes=None): + """Register a new check object.""" + def _add_check(check, kind, codes, args): + if check in _checks[kind]: + _checks[kind][check][0].extend(codes or []) + else: + _checks[kind][check] = (codes or [''], args) + if inspect.isfunction(check): + args = inspect.getargspec(check)[0] + if args and args[0] in ('physical_line', 'logical_line'): + if codes is None: + codes = ERRORCODE_REGEX.findall(check.__doc__ or '') + _add_check(check, args[0], codes, args) + elif inspect.isclass(check): + if inspect.getargspec(check.__init__)[0][:2] == ['self', 'tree']: + _add_check(check, 'tree', codes, None) + + +def init_checks_registry(): + """Register all globally visible functions. + + The first argument name is either 'physical_line' or 'logical_line'. + """ + mod = inspect.getmodule(register_check) + for (name, function) in inspect.getmembers(mod, inspect.isfunction): + register_check(function) +init_checks_registry() + + +class Checker(object): + """Load a Python source file, tokenize it, check coding style.""" + + def __init__(self, filename=None, lines=None, + options=None, report=None, **kwargs): + if options is None: + options = StyleGuide(kwargs).options + else: + assert not kwargs + self._io_error = None + self._physical_checks = options.physical_checks + self._logical_checks = options.logical_checks + self._ast_checks = options.ast_checks + self.max_line_length = options.max_line_length + self.multiline = False # in a multiline string? + self.hang_closing = options.hang_closing + self.verbose = options.verbose + self.filename = filename + if filename is None: + self.filename = 'stdin' + self.lines = lines or [] + elif filename == '-': + self.filename = 'stdin' + self.lines = stdin_get_value().splitlines(True) + elif lines is None: + try: + self.lines = readlines(filename) + except IOError: + (exc_type, exc) = sys.exc_info()[:2] + self._io_error = '%s: %s' % (exc_type.__name__, exc) + self.lines = [] + else: + self.lines = lines + if self.lines: + ord0 = ord(self.lines[0][0]) + if ord0 in (0xef, 0xfeff): # Strip the UTF-8 BOM + if ord0 == 0xfeff: + self.lines[0] = self.lines[0][1:] + elif self.lines[0][:3] == '\xef\xbb\xbf': + self.lines[0] = self.lines[0][3:] + self.report = report or options.report + self.report_error = self.report.error + + def report_invalid_syntax(self): + """Check if the syntax is valid.""" + (exc_type, exc) = sys.exc_info()[:2] + if len(exc.args) > 1: + offset = exc.args[1] + if len(offset) > 2: + offset = offset[1:3] + else: + offset = (1, 0) + self.report_error(offset[0], offset[1] or 0, + 'E901 %s: %s' % (exc_type.__name__, exc.args[0]), + self.report_invalid_syntax) + + def readline(self): + """Get the next line from the input buffer.""" + if self.line_number >= self.total_lines: + return '' + line = self.lines[self.line_number] + self.line_number += 1 + if self.indent_char is None and line[:1] in WHITESPACE: + self.indent_char = line[0] + return line + + def run_check(self, check, argument_names): + """Run a check plugin.""" + arguments = [] + for name in argument_names: + arguments.append(getattr(self, name)) + return check(*arguments) + + def check_physical(self, line): + """Run all physical checks on a raw input line.""" + self.physical_line = line + for name, check, argument_names in self._physical_checks: + result = self.run_check(check, argument_names) + if result is not None: + (offset, text) = result + self.report_error(self.line_number, offset, text, check) + if text[:4] == 'E101': + self.indent_char = line[0] + + def build_tokens_line(self): + """Build a logical line from tokens.""" + logical = [] + comments = [] + length = 0 + prev_row = prev_col = mapping = None + for token_type, text, start, end, line in self.tokens: + if token_type in SKIP_TOKENS: + continue + if not mapping: + mapping = [(0, start)] + if token_type == tokenize.COMMENT: + comments.append(text) + continue + if token_type == tokenize.STRING: + text = mute_string(text) + if prev_row: + (start_row, start_col) = start + if prev_row != start_row: # different row + prev_text = self.lines[prev_row - 1][prev_col - 1] + if prev_text == ',' or (prev_text not in '{[(' + and text not in '}])'): + text = ' ' + text + elif prev_col != start_col: # different column + text = line[prev_col:start_col] + text + logical.append(text) + length += len(text) + mapping.append((length, end)) + (prev_row, prev_col) = end + self.logical_line = ''.join(logical) + self.noqa = comments and noqa(''.join(comments)) + return mapping + + def check_logical(self): + """Build a line from tokens and run all logical checks on it.""" + self.report.increment_logical_line() + mapping = self.build_tokens_line() + (start_row, start_col) = mapping[0][1] + start_line = self.lines[start_row - 1] + self.indent_level = expand_indent(start_line[:start_col]) + if self.blank_before < self.blank_lines: + self.blank_before = self.blank_lines + if self.verbose >= 2: + print(self.logical_line[:80].rstrip()) + for name, check, argument_names in self._logical_checks: + if self.verbose >= 4: + print(' ' + name) + for offset, text in self.run_check(check, argument_names) or (): + if not isinstance(offset, tuple): + for token_offset, pos in mapping: + if offset <= token_offset: + break + offset = (pos[0], pos[1] + offset - token_offset) + self.report_error(offset[0], offset[1], text, check) + if self.logical_line: + self.previous_indent_level = self.indent_level + self.previous_logical = self.logical_line + self.blank_lines = 0 + self.tokens = [] + + def check_ast(self): + """Build the file's AST and run all AST checks.""" + try: + tree = compile(''.join(self.lines), '', 'exec', PyCF_ONLY_AST) + except (SyntaxError, TypeError): + return self.report_invalid_syntax() + for name, cls, __ in self._ast_checks: + checker = cls(tree, self.filename) + for lineno, offset, text, check in checker.run(): + if not self.lines or not noqa(self.lines[lineno - 1]): + self.report_error(lineno, offset, text, check) + + def generate_tokens(self): + """Tokenize the file, run physical line checks and yield tokens.""" + if self._io_error: + self.report_error(1, 0, 'E902 %s' % self._io_error, readlines) + tokengen = tokenize.generate_tokens(self.readline) + try: + for token in tokengen: + if token[2][0] > self.total_lines: + return + self.maybe_check_physical(token) + yield token + except (SyntaxError, tokenize.TokenError): + self.report_invalid_syntax() + + def maybe_check_physical(self, token): + """If appropriate (based on token), check current physical line(s).""" + # Called after every token, but act only on end of line. + if _is_eol_token(token): + # Obviously, a newline token ends a single physical line. + self.check_physical(token[4]) + elif token[0] == tokenize.STRING and '\n' in token[1]: + # Less obviously, a string that contains newlines is a + # multiline string, either triple-quoted or with internal + # newlines backslash-escaped. Check every physical line in the + # string *except* for the last one: its newline is outside of + # the multiline string, so we consider it a regular physical + # line, and will check it like any other physical line. + # + # Subtleties: + # - we don't *completely* ignore the last line; if it contains + # the magical "# noqa" comment, we disable all physical + # checks for the entire multiline string + # - have to wind self.line_number back because initially it + # points to the last line of the string, and we want + # check_physical() to give accurate feedback + if noqa(token[4]): + return + self.multiline = True + self.line_number = token[2][0] + for line in token[1].split('\n')[:-1]: + self.check_physical(line + '\n') + self.line_number += 1 + self.multiline = False + + def check_all(self, expected=None, line_offset=0): + """Run all checks on the input file.""" + self.report.init_file(self.filename, self.lines, expected, line_offset) + self.total_lines = len(self.lines) + if self._ast_checks: + self.check_ast() + self.line_number = 0 + self.indent_char = None + self.indent_level = self.previous_indent_level = 0 + self.previous_logical = '' + self.tokens = [] + self.blank_lines = self.blank_before = 0 + parens = 0 + for token in self.generate_tokens(): + self.tokens.append(token) + token_type, text = token[0:2] + if self.verbose >= 3: + if token[2][0] == token[3][0]: + pos = '[%s:%s]' % (token[2][1] or '', token[3][1]) + else: + pos = 'l.%s' % token[3][0] + print('l.%s\t%s\t%s\t%r' % + (token[2][0], pos, tokenize.tok_name[token[0]], text)) + if token_type == tokenize.OP: + if text in '([{': + parens += 1 + elif text in '}])': + parens -= 1 + elif not parens: + if token_type in NEWLINE: + if token_type == tokenize.NEWLINE: + self.check_logical() + self.blank_before = 0 + elif len(self.tokens) == 1: + # The physical line contains only this token. + self.blank_lines += 1 + del self.tokens[0] + else: + self.check_logical() + elif COMMENT_WITH_NL and token_type == tokenize.COMMENT: + if len(self.tokens) == 1: + # The comment also ends a physical line + token = list(token) + token[1] = text.rstrip('\r\n') + token[3] = (token[2][0], token[2][1] + len(token[1])) + self.tokens = [tuple(token)] + self.check_logical() + if self.tokens: + self.check_physical(self.lines[-1]) + self.check_logical() + return self.report.get_file_results() + + +class BaseReport(object): + """Collect the results of the checks.""" + + print_filename = False + + def __init__(self, options): + self._benchmark_keys = options.benchmark_keys + self._ignore_code = options.ignore_code + # Results + self.elapsed = 0 + self.total_errors = 0 + self.counters = dict.fromkeys(self._benchmark_keys, 0) + self.messages = {} + + def start(self): + """Start the timer.""" + self._start_time = time.time() + + def stop(self): + """Stop the timer.""" + self.elapsed = time.time() - self._start_time + + def init_file(self, filename, lines, expected, line_offset): + """Signal a new file.""" + self.filename = filename + self.lines = lines + self.expected = expected or () + self.line_offset = line_offset + self.file_errors = 0 + self.counters['files'] += 1 + self.counters['physical lines'] += len(lines) + + def increment_logical_line(self): + """Signal a new logical line.""" + self.counters['logical lines'] += 1 + + def error(self, line_number, offset, text, check): + """Report an error, according to options.""" + code = text[:4] + if self._ignore_code(code): + return + if code in self.counters: + self.counters[code] += 1 + else: + self.counters[code] = 1 + self.messages[code] = text[5:] + # Don't care about expected errors or warnings + if code in self.expected: + return + if self.print_filename and not self.file_errors: + print(self.filename) + self.file_errors += 1 + self.total_errors += 1 + return code + + def get_file_results(self): + """Return the count of errors and warnings for this file.""" + return self.file_errors + + def get_count(self, prefix=''): + """Return the total count of errors and warnings.""" + return sum([self.counters[key] + for key in self.messages if key.startswith(prefix)]) + + def get_statistics(self, prefix=''): + """Get statistics for message codes that start with the prefix. + + prefix='' matches all errors and warnings + prefix='E' matches all errors + prefix='W' matches all warnings + prefix='E4' matches all errors that have to do with imports + """ + return ['%-7s %s %s' % (self.counters[key], key, self.messages[key]) + for key in sorted(self.messages) if key.startswith(prefix)] + + def print_statistics(self, prefix=''): + """Print overall statistics (number of errors and warnings).""" + for line in self.get_statistics(prefix): + print(line) + + def print_benchmark(self): + """Print benchmark numbers.""" + print('%-7.2f %s' % (self.elapsed, 'seconds elapsed')) + if self.elapsed: + for key in self._benchmark_keys: + print('%-7d %s per second (%d total)' % + (self.counters[key] / self.elapsed, key, + self.counters[key])) + + +class FileReport(BaseReport): + """Collect the results of the checks and print only the filenames.""" + print_filename = True + + +class StandardReport(BaseReport): + """Collect and print the results of the checks.""" + + def __init__(self, options): + super(StandardReport, self).__init__(options) + self._fmt = REPORT_FORMAT.get(options.format.lower(), + options.format) + self._repeat = options.repeat + self._show_source = options.show_source + self._show_pep8 = options.show_pep8 + + def init_file(self, filename, lines, expected, line_offset): + """Signal a new file.""" + self._deferred_print = [] + return super(StandardReport, self).init_file( + filename, lines, expected, line_offset) + + def error(self, line_number, offset, text, check): + """Report an error, according to options.""" + code = super(StandardReport, self).error(line_number, offset, + text, check) + if code and (self.counters[code] == 1 or self._repeat): + self._deferred_print.append( + (line_number, offset, code, text[5:], check.__doc__)) + return code + + def get_file_results(self): + """Print the result and return the overall count for this file.""" + self._deferred_print.sort() + for line_number, offset, code, text, doc in self._deferred_print: + print(self._fmt % { + 'path': self.filename, + 'row': self.line_offset + line_number, 'col': offset + 1, + 'code': code, 'text': text, + }) + if self._show_source: + if line_number > len(self.lines): + line = '' + else: + line = self.lines[line_number - 1] + print(line.rstrip()) + print(re.sub(r'\S', ' ', line[:offset]) + '^') + if self._show_pep8 and doc: + print(' ' + doc.strip()) + return self.file_errors + + +class DiffReport(StandardReport): + """Collect and print the results for the changed lines only.""" + + def __init__(self, options): + super(DiffReport, self).__init__(options) + self._selected = options.selected_lines + + def error(self, line_number, offset, text, check): + if line_number not in self._selected[self.filename]: + return + return super(DiffReport, self).error(line_number, offset, text, check) + + +class StyleGuide(object): + """Initialize a PEP-8 instance with few options.""" + + def __init__(self, *args, **kwargs): + # build options from the command line + self.checker_class = kwargs.pop('checker_class', Checker) + parse_argv = kwargs.pop('parse_argv', False) + config_file = kwargs.pop('config_file', None) + parser = kwargs.pop('parser', None) + # build options from dict + options_dict = dict(*args, **kwargs) + arglist = None if parse_argv else options_dict.get('paths', None) + options, self.paths = process_options( + arglist, parse_argv, config_file, parser) + if options_dict: + options.__dict__.update(options_dict) + if 'paths' in options_dict: + self.paths = options_dict['paths'] + + self.runner = self.input_file + self.options = options + + if not options.reporter: + options.reporter = BaseReport if options.quiet else StandardReport + + options.select = tuple(options.select or ()) + if not (options.select or options.ignore or + options.testsuite or options.doctest) and DEFAULT_IGNORE: + # The default choice: ignore controversial checks + options.ignore = tuple(DEFAULT_IGNORE.split(',')) + else: + # Ignore all checks which are not explicitly selected + options.ignore = ('',) if options.select else tuple(options.ignore) + options.benchmark_keys = BENCHMARK_KEYS[:] + options.ignore_code = self.ignore_code + options.physical_checks = self.get_checks('physical_line') + options.logical_checks = self.get_checks('logical_line') + options.ast_checks = self.get_checks('tree') + self.init_report() + + def init_report(self, reporter=None): + """Initialize the report instance.""" + self.options.report = (reporter or self.options.reporter)(self.options) + return self.options.report + + def check_files(self, paths=None): + """Run all checks on the paths.""" + if paths is None: + paths = self.paths + report = self.options.report + runner = self.runner + report.start() + try: + for path in paths: + if os.path.isdir(path): + self.input_dir(path) + elif not self.excluded(path): + runner(path) + except KeyboardInterrupt: + print('... stopped') + report.stop() + return report + + def input_file(self, filename, lines=None, expected=None, line_offset=0): + """Run all checks on a Python source file.""" + if self.options.verbose: + print('checking %s' % filename) + fchecker = self.checker_class( + filename, lines=lines, options=self.options) + return fchecker.check_all(expected=expected, line_offset=line_offset) + + def input_dir(self, dirname): + """Check all files in this directory and all subdirectories.""" + dirname = dirname.rstrip('/') + if self.excluded(dirname): + return 0 + counters = self.options.report.counters + verbose = self.options.verbose + filepatterns = self.options.filename + runner = self.runner + for root, dirs, files in os.walk(dirname): + if verbose: + print('directory ' + root) + counters['directories'] += 1 + for subdir in sorted(dirs): + if self.excluded(subdir, root): + dirs.remove(subdir) + for filename in sorted(files): + # contain a pattern that matches? + if ((filename_match(filename, filepatterns) and + not self.excluded(filename, root))): + runner(os.path.join(root, filename)) + + def excluded(self, filename, parent=None): + """Check if the file should be excluded. + + Check if 'options.exclude' contains a pattern that matches filename. + """ + if not self.options.exclude: + return False + basename = os.path.basename(filename) + if filename_match(basename, self.options.exclude): + return True + if parent: + filename = os.path.join(parent, filename) + filename = os.path.abspath(filename) + return filename_match(filename, self.options.exclude) + + def ignore_code(self, code): + """Check if the error code should be ignored. + + If 'options.select' contains a prefix of the error code, + return False. Else, if 'options.ignore' contains a prefix of + the error code, return True. + """ + if len(code) < 4 and any(s.startswith(code) + for s in self.options.select): + return False + return (code.startswith(self.options.ignore) and + not code.startswith(self.options.select)) + + def get_checks(self, argument_name): + """Get all the checks for this category. + + Find all globally visible functions where the first argument name + starts with argument_name and which contain selected tests. + """ + checks = [] + for check, attrs in _checks[argument_name].items(): + (codes, args) = attrs + if any(not (code and self.ignore_code(code)) for code in codes): + checks.append((check.__name__, check, args)) + return sorted(checks) + + +def get_parser(prog='pep8', version=__version__): + parser = OptionParser(prog=prog, version=version, + usage="%prog [options] input ...") + parser.config_options = [ + 'exclude', 'filename', 'select', 'ignore', 'max-line-length', + 'hang-closing', 'count', 'format', 'quiet', 'show-pep8', + 'show-source', 'statistics', 'verbose'] + parser.add_option('-v', '--verbose', default=0, action='count', + help="print status messages, or debug with -vv") + parser.add_option('-q', '--quiet', default=0, action='count', + help="report only file names, or nothing with -qq") + parser.add_option('-r', '--repeat', default=True, action='store_true', + help="(obsolete) show all occurrences of the same error") + parser.add_option('--first', action='store_false', dest='repeat', + help="show first occurrence of each error") + parser.add_option('--exclude', metavar='patterns', default=DEFAULT_EXCLUDE, + help="exclude files or directories which match these " + "comma separated patterns (default: %default)") + parser.add_option('--filename', metavar='patterns', default='*.py', + help="when parsing directories, only check filenames " + "matching these comma separated patterns " + "(default: %default)") + parser.add_option('--select', metavar='errors', default='', + help="select errors and warnings (e.g. E,W6)") + parser.add_option('--ignore', metavar='errors', default='', + help="skip errors and warnings (e.g. E4,W)") + parser.add_option('--show-source', action='store_true', + help="show source code for each error") + parser.add_option('--show-pep8', action='store_true', + help="show text of PEP 8 for each error " + "(implies --first)") + parser.add_option('--statistics', action='store_true', + help="count errors and warnings") + parser.add_option('--count', action='store_true', + help="print total number of errors and warnings " + "to standard error and set exit code to 1 if " + "total is not null") + parser.add_option('--max-line-length', type='int', metavar='n', + default=MAX_LINE_LENGTH, + help="set maximum allowed line length " + "(default: %default)") + parser.add_option('--hang-closing', action='store_true', + help="hang closing bracket instead of matching " + "indentation of opening bracket's line") + parser.add_option('--format', metavar='format', default='default', + help="set the error format [default|pylint|]") + parser.add_option('--diff', action='store_true', + help="report only lines changed according to the " + "unified diff received on STDIN") + group = parser.add_option_group("Testing Options") + if os.path.exists(TESTSUITE_PATH): + group.add_option('--testsuite', metavar='dir', + help="run regression tests from dir") + group.add_option('--doctest', action='store_true', + help="run doctest on myself") + group.add_option('--benchmark', action='store_true', + help="measure processing speed") + return parser + + +def read_config(options, args, arglist, parser): + """Read both user configuration and local configuration.""" + config = RawConfigParser() + + user_conf = options.config + if user_conf and os.path.isfile(user_conf): + if options.verbose: + print('user configuration: %s' % user_conf) + config.read(user_conf) + + local_dir = os.curdir + parent = tail = args and os.path.abspath(os.path.commonprefix(args)) + while tail: + if config.read([os.path.join(parent, fn) for fn in PROJECT_CONFIG]): + local_dir = parent + if options.verbose: + print('local configuration: in %s' % parent) + break + (parent, tail) = os.path.split(parent) + + pep8_section = parser.prog + if config.has_section(pep8_section): + option_list = dict([(o.dest, o.type or o.action) + for o in parser.option_list]) + + # First, read the default values + (new_options, __) = parser.parse_args([]) + + # Second, parse the configuration + for opt in config.options(pep8_section): + if opt.replace('_', '-') not in parser.config_options: + print(" unknown option '%s' ignored" % opt) + continue + if options.verbose > 1: + print(" %s = %s" % (opt, config.get(pep8_section, opt))) + normalized_opt = opt.replace('-', '_') + opt_type = option_list[normalized_opt] + if opt_type in ('int', 'count'): + value = config.getint(pep8_section, opt) + elif opt_type == 'string': + value = config.get(pep8_section, opt) + if normalized_opt == 'exclude': + value = normalize_paths(value, local_dir) + else: + assert opt_type in ('store_true', 'store_false') + value = config.getboolean(pep8_section, opt) + setattr(new_options, normalized_opt, value) + + # Third, overwrite with the command-line options + (options, __) = parser.parse_args(arglist, values=new_options) + options.doctest = options.testsuite = False + return options + + +def process_options(arglist=None, parse_argv=False, config_file=None, + parser=None): + """Process options passed either via arglist or via command line args.""" + if not parser: + parser = get_parser() + if not parser.has_option('--config'): + if config_file is True: + config_file = DEFAULT_CONFIG + group = parser.add_option_group("Configuration", description=( + "The project options are read from the [%s] section of the " + "tox.ini file or the setup.cfg file located in any parent folder " + "of the path(s) being processed. Allowed options are: %s." % + (parser.prog, ', '.join(parser.config_options)))) + group.add_option('--config', metavar='path', default=config_file, + help="user config file location (default: %default)") + # Don't read the command line if the module is used as a library. + if not arglist and not parse_argv: + arglist = [] + # If parse_argv is True and arglist is None, arguments are + # parsed from the command line (sys.argv) + (options, args) = parser.parse_args(arglist) + options.reporter = None + + if options.ensure_value('testsuite', False): + args.append(options.testsuite) + elif not options.ensure_value('doctest', False): + if parse_argv and not args: + if options.diff or any(os.path.exists(name) + for name in PROJECT_CONFIG): + args = ['.'] + else: + parser.error('input not specified') + options = read_config(options, args, arglist, parser) + options.reporter = parse_argv and options.quiet == 1 and FileReport + + options.filename = options.filename and options.filename.split(',') + options.exclude = normalize_paths(options.exclude) + options.select = options.select and options.select.split(',') + options.ignore = options.ignore and options.ignore.split(',') + + if options.diff: + options.reporter = DiffReport + stdin = stdin_get_value() + options.selected_lines = parse_udiff(stdin, options.filename, args[0]) + args = sorted(options.selected_lines) + + return options, args + + +def _main(): + """Parse options and run checks on Python source.""" + import signal + + # Handle "Broken pipe" gracefully + try: + signal.signal(signal.SIGPIPE, lambda signum, frame: sys.exit(1)) + except AttributeError: + pass # not supported on Windows + + pep8style = StyleGuide(parse_argv=True, config_file=True) + options = pep8style.options + if options.doctest or options.testsuite: + from testsuite.support import run_tests + report = run_tests(pep8style) + else: + report = pep8style.check_files() + if options.statistics: + report.print_statistics() + if options.benchmark: + report.print_benchmark() + if options.testsuite and not options.quiet: + report.print_results() + if report.total_errors: + if options.count: + sys.stderr.write(str(report.total_errors) + '\n') + sys.exit(1) + +if __name__ == '__main__': + _main() \ No newline at end of file diff --git a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/__init__.py b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/__init__.py new file mode 100644 index 000000000000..fb5582978802 --- /dev/null +++ b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/__init__.py @@ -0,0 +1,514 @@ +#@PydevCodeAnalysisIgnore +"""create and manipulate C data types in Python""" + +import os as _os +import sys as _sys + +# special developer support to use ctypes from the CVS sandbox, +# without installing it +# XXX Remove this for the python core version +_magicfile = _os.path.join(_os.path.dirname(__file__), ".CTYPES_DEVEL") +if _os.path.isfile(_magicfile): + execfile(_magicfile) +del _magicfile + +__version__ = "0.9.9.6" + +from _ctypes import _Pointer +from _ctypes import CFuncPtr as _CFuncPtr +from _ctypes import __version__ as _ctypes_version +from _ctypes import RTLD_LOCAL + +from struct import calcsize as _calcsize + +if __version__ != _ctypes_version: + raise Exception, ("Version number mismatch", __version__, _ctypes_version) + +if _os.name in ("nt", "ce"): + from _ctypes import FormatError + +from _ctypes import FUNCFLAG_CDECL as _FUNCFLAG_CDECL, \ + FUNCFLAG_PYTHONAPI as _FUNCFLAG_PYTHONAPI + +""" +WINOLEAPI -> HRESULT +WINOLEAPI_(type) + +STDMETHODCALLTYPE + +STDMETHOD(name) +STDMETHOD_(type, name) + +STDAPICALLTYPE +""" + +def create_string_buffer(init, size=None): + """create_string_buffer(aString) -> character array + create_string_buffer(anInteger) -> character array + create_string_buffer(aString, anInteger) -> character array + """ + if isinstance(init, (str, unicode)): + if size is None: + size = len(init) + 1 + buftype = c_char * size + buf = buftype() + buf.value = init + return buf + elif isinstance(init, (int, long)): + buftype = c_char * init + buf = buftype() + return buf + raise TypeError, init + +def c_buffer(init, size=None): +## "deprecated, use create_string_buffer instead" +## import warnings +## warnings.warn("c_buffer is deprecated, use create_string_buffer instead", +## DeprecationWarning, stacklevel=2) + return create_string_buffer(init, size) + +_c_functype_cache = {} +def CFUNCTYPE(restype, *argtypes): + """CFUNCTYPE(restype, *argtypes) -> function prototype. + + restype: the result type + argtypes: a sequence specifying the argument types + + The function prototype can be called in three ways to create a + callable object: + + prototype(integer address) -> foreign function + prototype(callable) -> create and return a C callable function from callable + prototype(integer index, method name[, paramflags]) -> foreign function calling a COM method + prototype((ordinal number, dll object)[, paramflags]) -> foreign function exported by ordinal + prototype((function name, dll object)[, paramflags]) -> foreign function exported by name + """ + try: + return _c_functype_cache[(restype, argtypes)] + except KeyError: + class CFunctionType(_CFuncPtr): + _argtypes_ = argtypes + _restype_ = restype + _flags_ = _FUNCFLAG_CDECL + _c_functype_cache[(restype, argtypes)] = CFunctionType + return CFunctionType + +if _os.name in ("nt", "ce"): + from _ctypes import LoadLibrary as _dlopen + from _ctypes import FUNCFLAG_STDCALL as _FUNCFLAG_STDCALL + if _os.name == "ce": + # 'ce' doesn't have the stdcall calling convention + _FUNCFLAG_STDCALL = _FUNCFLAG_CDECL + + _win_functype_cache = {} + def WINFUNCTYPE(restype, *argtypes): + # docstring set later (very similar to CFUNCTYPE.__doc__) + try: + return _win_functype_cache[(restype, argtypes)] + except KeyError: + class WinFunctionType(_CFuncPtr): + _argtypes_ = argtypes + _restype_ = restype + _flags_ = _FUNCFLAG_STDCALL + _win_functype_cache[(restype, argtypes)] = WinFunctionType + return WinFunctionType + if WINFUNCTYPE.__doc__: + WINFUNCTYPE.__doc__ = CFUNCTYPE.__doc__.replace("CFUNCTYPE", "WINFUNCTYPE") + +elif _os.name == "posix": + from _ctypes import dlopen as _dlopen #@UnresolvedImport + +from _ctypes import sizeof +from _ctypes import _SimpleCData + +class py_object(_SimpleCData): + _type_ = "O" + +class c_short(_SimpleCData): + _type_ = "h" + +class c_ushort(_SimpleCData): + _type_ = "H" + +class c_long(_SimpleCData): + _type_ = "l" + +class c_ulong(_SimpleCData): + _type_ = "L" + +if _calcsize("i") == _calcsize("l"): + # if int and long have the same size, make c_int an alias for c_long + c_int = c_long + c_uint = c_ulong +else: + class c_int(_SimpleCData): + _type_ = "i" + + class c_uint(_SimpleCData): + _type_ = "I" + +class c_float(_SimpleCData): + _type_ = "f" + +class c_double(_SimpleCData): + _type_ = "d" + +if _calcsize("l") == _calcsize("q"): + # if long and long long have the same size, make c_longlong an alias for c_long + c_longlong = c_long + c_ulonglong = c_ulong +else: + class c_longlong(_SimpleCData): + _type_ = "q" + + class c_ulonglong(_SimpleCData): + _type_ = "Q" + ## def from_param(cls, val): + ## return ('d', float(val), val) + ## from_param = classmethod(from_param) + +class c_ubyte(_SimpleCData): + _type_ = "B" +c_ubyte.__ctype_le__ = c_ubyte.__ctype_be__ = c_ubyte +# backward compatibility: +##c_uchar = c_ubyte + +class c_byte(_SimpleCData): + _type_ = "b" +c_byte.__ctype_le__ = c_byte.__ctype_be__ = c_byte + +class c_char(_SimpleCData): + _type_ = "c" +c_char.__ctype_le__ = c_char.__ctype_be__ = c_char + +class c_char_p(_SimpleCData): + _type_ = "z" + +class c_void_p(_SimpleCData): + _type_ = "P" +c_voidp = c_void_p # backwards compatibility (to a bug) + +# This cache maps types to pointers to them. +_pointer_type_cache = {} + +def POINTER(cls): + try: + return _pointer_type_cache[cls] + except KeyError: + pass + if type(cls) is str: + klass = type(_Pointer)("LP_%s" % cls, + (_Pointer,), + {}) + _pointer_type_cache[id(klass)] = klass + return klass + else: + name = "LP_%s" % cls.__name__ + klass = type(_Pointer)(name, + (_Pointer,), + {'_type_': cls}) + _pointer_type_cache[cls] = klass + return klass + +try: + from _ctypes import set_conversion_mode +except ImportError: + pass +else: + if _os.name in ("nt", "ce"): + set_conversion_mode("mbcs", "ignore") + else: + set_conversion_mode("ascii", "strict") + + class c_wchar_p(_SimpleCData): + _type_ = "Z" + + class c_wchar(_SimpleCData): + _type_ = "u" + + POINTER(c_wchar).from_param = c_wchar_p.from_param #_SimpleCData.c_wchar_p_from_param + + def create_unicode_buffer(init, size=None): + """create_unicode_buffer(aString) -> character array + create_unicode_buffer(anInteger) -> character array + create_unicode_buffer(aString, anInteger) -> character array + """ + if isinstance(init, (str, unicode)): + if size is None: + size = len(init) + 1 + buftype = c_wchar * size + buf = buftype() + buf.value = init + return buf + elif isinstance(init, (int, long)): + buftype = c_wchar * init + buf = buftype() + return buf + raise TypeError, init + +POINTER(c_char).from_param = c_char_p.from_param #_SimpleCData.c_char_p_from_param + +# XXX Deprecated +def SetPointerType(pointer, cls): + if _pointer_type_cache.get(cls, None) is not None: + raise RuntimeError, \ + "This type already exists in the cache" + if not _pointer_type_cache.has_key(id(pointer)): + raise RuntimeError, \ + "What's this???" + pointer.set_type(cls) + _pointer_type_cache[cls] = pointer + del _pointer_type_cache[id(pointer)] + + +def pointer(inst): + return POINTER(type(inst))(inst) + +# XXX Deprecated +def ARRAY(typ, len): + return typ * len + +################################################################ + + +class CDLL(object): + """An instance of this class represents a loaded dll/shared + library, exporting functions using the standard C calling + convention (named 'cdecl' on Windows). + + The exported functions can be accessed as attributes, or by + indexing with the function name. Examples: + + .qsort -> callable object + ['qsort'] -> callable object + + Calling the functions releases the Python GIL during the call and + reaquires it afterwards. + """ + class _FuncPtr(_CFuncPtr): + _flags_ = _FUNCFLAG_CDECL + _restype_ = c_int # default, can be overridden in instances + + def __init__(self, name, mode=RTLD_LOCAL, handle=None): + self._name = name + if handle is None: + self._handle = _dlopen(self._name, mode) + else: + self._handle = handle + + def __repr__(self): + return "<%s '%s', handle %x at %x>" % \ + (self.__class__.__name__, self._name, + (self._handle & (_sys.maxint * 2 + 1)), + id(self)) + + def __getattr__(self, name): + if name.startswith('__') and name.endswith('__'): + raise AttributeError, name + return self.__getitem__(name) + + def __getitem__(self, name_or_ordinal): + func = self._FuncPtr((name_or_ordinal, self)) + if not isinstance(name_or_ordinal, (int, long)): + func.__name__ = name_or_ordinal + setattr(self, name_or_ordinal, func) + return func + +class PyDLL(CDLL): + """This class represents the Python library itself. It allows to + access Python API functions. The GIL is not released, and + Python exceptions are handled correctly. + """ + class _FuncPtr(_CFuncPtr): + _flags_ = _FUNCFLAG_CDECL | _FUNCFLAG_PYTHONAPI + _restype_ = c_int # default, can be overridden in instances + +if _os.name in ("nt", "ce"): + + class WinDLL(CDLL): + """This class represents a dll exporting functions using the + Windows stdcall calling convention. + """ + class _FuncPtr(_CFuncPtr): + _flags_ = _FUNCFLAG_STDCALL + _restype_ = c_int # default, can be overridden in instances + + # XXX Hm, what about HRESULT as normal parameter? + # Mustn't it derive from c_long then? + from _ctypes import _check_HRESULT, _SimpleCData + class HRESULT(_SimpleCData): + _type_ = "l" + # _check_retval_ is called with the function's result when it + # is used as restype. It checks for the FAILED bit, and + # raises a WindowsError if it is set. + # + # The _check_retval_ method is implemented in C, so that the + # method definition itself is not included in the traceback + # when it raises an error - that is what we want (and Python + # doesn't have a way to raise an exception in the caller's + # frame). + _check_retval_ = _check_HRESULT + + class OleDLL(CDLL): + """This class represents a dll exporting functions using the + Windows stdcall calling convention, and returning HRESULT. + HRESULT error values are automatically raised as WindowsError + exceptions. + """ + class _FuncPtr(_CFuncPtr): + _flags_ = _FUNCFLAG_STDCALL + _restype_ = HRESULT + +class LibraryLoader(object): + def __init__(self, dlltype): + self._dlltype = dlltype + + def __getattr__(self, name): + if name[0] == '_': + raise AttributeError(name) + dll = self._dlltype(name) + setattr(self, name, dll) + return dll + + def __getitem__(self, name): + return getattr(self, name) + + def LoadLibrary(self, name): + return self._dlltype(name) + +cdll = LibraryLoader(CDLL) +pydll = LibraryLoader(PyDLL) + +if _os.name in ("nt", "ce"): + pythonapi = PyDLL("python dll", None, _sys.dllhandle) +elif _sys.platform == "cygwin": + pythonapi = PyDLL("libpython%d.%d.dll" % _sys.version_info[:2]) +else: + pythonapi = PyDLL(None) + + +if _os.name in ("nt", "ce"): + windll = LibraryLoader(WinDLL) + oledll = LibraryLoader(OleDLL) + + if _os.name == "nt": + GetLastError = windll.kernel32.GetLastError + else: + GetLastError = windll.coredll.GetLastError + + def WinError(code=None, descr=None): + if code is None: + code = GetLastError() + if descr is None: + descr = FormatError(code).strip() + return WindowsError(code, descr) + +_pointer_type_cache[None] = c_void_p + +if sizeof(c_uint) == sizeof(c_void_p): + c_size_t = c_uint +elif sizeof(c_ulong) == sizeof(c_void_p): + c_size_t = c_ulong + +# functions + +from _ctypes import _memmove_addr, _memset_addr, _string_at_addr, _cast_addr + +## void *memmove(void *, const void *, size_t); +memmove = CFUNCTYPE(c_void_p, c_void_p, c_void_p, c_size_t)(_memmove_addr) + +## void *memset(void *, int, size_t) +memset = CFUNCTYPE(c_void_p, c_void_p, c_int, c_size_t)(_memset_addr) + +def PYFUNCTYPE(restype, *argtypes): + class CFunctionType(_CFuncPtr): + _argtypes_ = argtypes + _restype_ = restype + _flags_ = _FUNCFLAG_CDECL | _FUNCFLAG_PYTHONAPI + return CFunctionType +_cast = PYFUNCTYPE(py_object, c_void_p, py_object)(_cast_addr) + +def cast(obj, typ): + result = _cast(obj, typ) + result.__keepref = obj + return result + +_string_at = CFUNCTYPE(py_object, c_void_p, c_int)(_string_at_addr) +def string_at(ptr, size=0): + """string_at(addr[, size]) -> string + + Return the string at addr.""" + return _string_at(ptr, size) + +try: + from _ctypes import _wstring_at_addr +except ImportError: + pass +else: + _wstring_at = CFUNCTYPE(py_object, c_void_p, c_int)(_wstring_at_addr) + def wstring_at(ptr, size=0): + """wstring_at(addr[, size]) -> string + + Return the string at addr.""" + return _wstring_at(ptr, size) + + +if _os.name == "nt": # COM stuff + def DllGetClassObject(rclsid, riid, ppv): + # First ask ctypes.com.server than comtypes.server for the + # class object. + + # trick py2exe by doing dynamic imports + result = -2147221231 # CLASS_E_CLASSNOTAVAILABLE + try: + ctcom = __import__("ctypes.com.server", globals(), locals(), ['*']) + except ImportError: + pass + else: + result = ctcom.DllGetClassObject(rclsid, riid, ppv) + + if result == -2147221231: # CLASS_E_CLASSNOTAVAILABLE + try: + ccom = __import__("comtypes.server", globals(), locals(), ['*']) + except ImportError: + pass + else: + result = ccom.DllGetClassObject(rclsid, riid, ppv) + + return result + + def DllCanUnloadNow(): + # First ask ctypes.com.server than comtypes.server if we can unload or not. + # trick py2exe by doing dynamic imports + result = 0 # S_OK + try: + ctcom = __import__("ctypes.com.server", globals(), locals(), ['*']) + except ImportError: + pass + else: + result = ctcom.DllCanUnloadNow() + if result != 0: # != S_OK + return result + + try: + ccom = __import__("comtypes.server", globals(), locals(), ['*']) + except ImportError: + return result + try: + return ccom.DllCanUnloadNow() + except AttributeError: + pass + return result + +# Fill in specifically-sized types +c_int8 = c_byte +c_uint8 = c_ubyte +for kind in [c_short, c_int, c_long, c_longlong]: + if sizeof(kind) == 2: c_int16 = kind + elif sizeof(kind) == 4: c_int32 = kind + elif sizeof(kind) == 8: c_int64 = kind +for kind in [c_ushort, c_uint, c_ulong, c_ulonglong]: + if sizeof(kind) == 2: c_uint16 = kind + elif sizeof(kind) == 4: c_uint32 = kind + elif sizeof(kind) == 8: c_uint64 = kind +del(kind) diff --git a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/_ctypes.dll b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/_ctypes.dll new file mode 100644 index 0000000000000000000000000000000000000000..238e869a5a0494d85428a913ece01fff9eeebdf1 GIT binary patch literal 287417 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 xrE4-h`JSN#FP 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 literal 0 HcmV?d00001 diff --git a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/_endian.py b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/_endian.py new file mode 100644 index 000000000000..7de037600717 --- /dev/null +++ b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/_endian.py @@ -0,0 +1,58 @@ +#@PydevCodeAnalysisIgnore +import sys +from ctypes import * + +_array_type = type(c_int * 3) + +def _other_endian(typ): + """Return the type with the 'other' byte order. Simple types like + c_int and so on already have __ctype_be__ and __ctype_le__ + attributes which contain the types, for more complicated types + only arrays are supported. + """ + try: + return getattr(typ, _OTHER_ENDIAN) + except AttributeError: + if type(typ) == _array_type: + return _other_endian(typ._type_) * typ._length_ + raise TypeError("This type does not support other endian: %s" % typ) + +class _swapped_meta(type(Structure)): + def __setattr__(self, attrname, value): + if attrname == "_fields_": + fields = [] + for desc in value: + name = desc[0] + typ = desc[1] + rest = desc[2:] + fields.append((name, _other_endian(typ)) + rest) + value = fields + super(_swapped_meta, self).__setattr__(attrname, value) + +################################################################ + +# Note: The Structure metaclass checks for the *presence* (not the +# value!) of a _swapped_bytes_ attribute to determine the bit order in +# structures containing bit fields. + +if sys.byteorder == "little": + _OTHER_ENDIAN = "__ctype_be__" + + LittleEndianStructure = Structure + + class BigEndianStructure(Structure): + """Structure with big endian byte order""" + __metaclass__ = _swapped_meta + _swappedbytes_ = None + +elif sys.byteorder == "big": + _OTHER_ENDIAN = "__ctype_le__" + + BigEndianStructure = Structure + class LittleEndianStructure(Structure): + """Structure with little endian byte order""" + __metaclass__ = _swapped_meta + _swappedbytes_ = None + +else: + raise RuntimeError("Invalid byteorder") diff --git a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/ctypes-README.txt b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/ctypes-README.txt new file mode 100644 index 000000000000..bf8de1e8767e --- /dev/null +++ b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/ctypes-README.txt @@ -0,0 +1,134 @@ +(Note: this is a compiled distribution of ctypes, compiled for cygwin + to allow using the cygwin conversions directly from interpreterInfo. The tests + have been removed to reduce the added size. It is only used by PyDev on cygwin). + +Overview + + ctypes is a ffi (Foreign Function Interface) package for Python. + + It allows to call functions exposed from dlls/shared libraries and + has extensive facilities to create, access and manipulate simpole + and complicated C data types transparently from Python - in other + words: wrap libraries in pure Python. + + ctypes runs on Windows, MacOS X, Linux, Solaris, FreeBSD. It may + also run on other systems, provided that libffi supports this + platform. + + On Windows, ctypes contains (the beginning of) a COM framework + mainly targetted to use and implement custom COM interfaces. + + +News + + ctypes now uses the same code base and libffi on all platforms. + For easier installation, the libffi sources are now included in + the source distribution - no need to find, build, and install a + compatible libffi version. + + +Requirements + + ctypes 0.9 requires Python 2.3 or higher, since it makes intensive + use of the new type system. + + ctypes uses libffi, which is copyright Red Hat, Inc. Complete + license see below. + + +Installation + + Windows + + On Windows, it is the easiest to download the executable + installer for your Python version and execute this. + + Installation from source + + Separate source distributions are available for windows and + non-windows systems. Please use the .zip file for Windows (it + contains the ctypes.com framework), and use the .tar.gz file + for non-Windows systems (it contains the complete + cross-platform libffi sources). + + To install ctypes from source, unpack the distribution, enter + the ctypes-0.9.x source directory, and enter + + python setup.py build + + This will build the Python extension modules. A C compiler is + required. On OS X, the segment attribute live_support must be + defined. If your compiler doesn't know about it, upgrade or + set the environment variable CCASFLAGS="-Dno_live_support". + + To run the supplied tests, enter + + python setup.py test + + To install ctypes, enter + + python setup.py install --help + + to see the avaibable options, and finally + + python setup.py install [options] + + + For Windows CE, a project file is provided in + wince\_ctypes.vcw. MS embedded Visual C 4.0 is required to + build the extension modules. + + +Additional notes + + Current version: 0.9.9.3 + + Homepage: http://starship.python.net/crew/theller/ctypes.html + + +ctypes license + + Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Thomas Heller + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +libffi license + + libffi - Copyright (c) 1996-2003 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the ``Software''), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR + ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/.cvsignore b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/.cvsignore new file mode 100644 index 000000000000..0d20b6487c61 --- /dev/null +++ b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/.cvsignore @@ -0,0 +1 @@ +*.pyc diff --git a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/__init__.py b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/__init__.py new file mode 100644 index 000000000000..5621defccd61 --- /dev/null +++ b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/__init__.py @@ -0,0 +1,9 @@ +""" +Enough Mach-O to make your head spin. + +See the relevant header files in /usr/include/mach-o + +And also Apple's documentation. +""" + +__version__ = '1.0' diff --git a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/dyld.py b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/dyld.py new file mode 100644 index 000000000000..85073aac11ec --- /dev/null +++ b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/dyld.py @@ -0,0 +1,167 @@ +#@PydevCodeAnalysisIgnore +""" +dyld emulation +""" + +import os +from framework import framework_info +from dylib import dylib_info +from itertools import * + +__all__ = [ + 'dyld_find', 'framework_find', + 'framework_info', 'dylib_info', +] + +# These are the defaults as per man dyld(1) +# +DEFAULT_FRAMEWORK_FALLBACK = [ + os.path.expanduser("~/Library/Frameworks"), + "/Library/Frameworks", + "/Network/Library/Frameworks", + "/System/Library/Frameworks", +] + +DEFAULT_LIBRARY_FALLBACK = [ + os.path.expanduser("~/lib"), + "/usr/local/lib", + "/lib", + "/usr/lib", +] + +def ensure_utf8(s): + """Not all of PyObjC and Python understand unicode paths very well yet""" + if isinstance(s, unicode): + return s.encode('utf8') + return s + +def dyld_env(env, var): + if env is None: + env = os.environ + rval = env.get(var) + if rval is None: + return [] + return rval.split(':') + +def dyld_image_suffix(env=None): + if env is None: + env = os.environ + return env.get('DYLD_IMAGE_SUFFIX') + +def dyld_framework_path(env=None): + return dyld_env(env, 'DYLD_FRAMEWORK_PATH') + +def dyld_library_path(env=None): + return dyld_env(env, 'DYLD_LIBRARY_PATH') + +def dyld_fallback_framework_path(env=None): + return dyld_env(env, 'DYLD_FALLBACK_FRAMEWORK_PATH') + +def dyld_fallback_library_path(env=None): + return dyld_env(env, 'DYLD_FALLBACK_LIBRARY_PATH') + +def dyld_image_suffix_search(iterator, env=None): + """For a potential path iterator, add DYLD_IMAGE_SUFFIX semantics""" + suffix = dyld_image_suffix(env) + if suffix is None: + return iterator + def _inject(iterator=iterator, suffix=suffix): + for path in iterator: + if path.endswith('.dylib'): + yield path[:-len('.dylib')] + suffix + '.dylib' + else: + yield path + suffix + yield path + return _inject() + +def dyld_override_search(name, env=None): + # If DYLD_FRAMEWORK_PATH is set and this dylib_name is a + # framework name, use the first file that exists in the framework + # path if any. If there is none go on to search the DYLD_LIBRARY_PATH + # if any. + + framework = framework_info(name) + + if framework is not None: + for path in dyld_framework_path(env): + yield os.path.join(path, framework['name']) + + # If DYLD_LIBRARY_PATH is set then use the first file that exists + # in the path. If none use the original name. + for path in dyld_library_path(env): + yield os.path.join(path, os.path.basename(name)) + +def dyld_executable_path_search(name, executable_path=None): + # If we haven't done any searching and found a library and the + # dylib_name starts with "@executable_path/" then construct the + # library name. + if name.startswith('@executable_path/') and executable_path is not None: + yield os.path.join(executable_path, name[len('@executable_path/'):]) + +def dyld_default_search(name, env=None): + yield name + + framework = framework_info(name) + + if framework is not None: + fallback_framework_path = dyld_fallback_framework_path(env) + for path in fallback_framework_path: + yield os.path.join(path, framework['name']) + + fallback_library_path = dyld_fallback_library_path(env) + for path in fallback_library_path: + yield os.path.join(path, os.path.basename(name)) + + if framework is not None and not fallback_framework_path: + for path in DEFAULT_FRAMEWORK_FALLBACK: + yield os.path.join(path, framework['name']) + + if not fallback_library_path: + for path in DEFAULT_LIBRARY_FALLBACK: + yield os.path.join(path, os.path.basename(name)) + +def dyld_find(name, executable_path=None, env=None): + """ + Find a library or framework using dyld semantics + """ + name = ensure_utf8(name) + executable_path = ensure_utf8(executable_path) + for path in dyld_image_suffix_search(chain( + dyld_override_search(name, env), + dyld_executable_path_search(name, executable_path), + dyld_default_search(name, env), + ), env): + if os.path.isfile(path): + return path + raise ValueError, "dylib %s could not be found" % (name,) + +def framework_find(fn, executable_path=None, env=None): + """ + Find a framework using dyld semantics in a very loose manner. + + Will take input such as: + Python + Python.framework + Python.framework/Versions/Current + """ + try: + return dyld_find(fn, executable_path=executable_path, env=env) + except ValueError: + pass + fmwk_index = fn.rfind('.framework') + if fmwk_index == -1: + fmwk_index = len(fn) + fn += '.framework' + fn = os.path.join(fn, os.path.basename(fn[:fmwk_index])) + try: + return dyld_find(fn, executable_path=executable_path, env=env) + except ValueError: + raise e + +def test_dyld_find(): + env = {} + assert dyld_find('libSystem.dylib') == '/usr/lib/libSystem.dylib' + assert dyld_find('System.framework/System') == '/System/Library/Frameworks/System.framework/System' + +if __name__ == '__main__': + test_dyld_find() diff --git a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/dylib.py b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/dylib.py new file mode 100644 index 000000000000..aa107507bd4a --- /dev/null +++ b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/dylib.py @@ -0,0 +1,63 @@ +""" +Generic dylib path manipulation +""" + +import re + +__all__ = ['dylib_info'] + +DYLIB_RE = re.compile(r"""(?x) +(?P^.*)(?:^|/) +(?P + (?P\w+?) + (?:\.(?P[^._]+))? + (?:_(?P[^._]+))? + \.dylib$ +) +""") + +def dylib_info(filename): + """ + A dylib name can take one of the following four forms: + Location/Name.SomeVersion_Suffix.dylib + Location/Name.SomeVersion.dylib + Location/Name_Suffix.dylib + Location/Name.dylib + + returns None if not found or a mapping equivalent to: + dict( + location='Location', + name='Name.SomeVersion_Suffix.dylib', + shortname='Name', + version='SomeVersion', + suffix='Suffix', + ) + + Note that SomeVersion and Suffix are optional and may be None + if not present. + """ + is_dylib = DYLIB_RE.match(filename) + if not is_dylib: + return None + return is_dylib.groupdict() + + +def test_dylib_info(): + def d(location=None, name=None, shortname=None, version=None, suffix=None): + return dict( + location=location, + name=name, + shortname=shortname, + version=version, + suffix=suffix + ) + assert dylib_info('completely/invalid') is None + assert dylib_info('completely/invalide_debug') is None + assert dylib_info('P/Foo.dylib') == d('P', 'Foo.dylib', 'Foo') + assert dylib_info('P/Foo_debug.dylib') == d('P', 'Foo_debug.dylib', 'Foo', suffix='debug') + assert dylib_info('P/Foo.A.dylib') == d('P', 'Foo.A.dylib', 'Foo', 'A') + assert dylib_info('P/Foo_debug.A.dylib') == d('P', 'Foo_debug.A.dylib', 'Foo_debug', 'A') + assert dylib_info('P/Foo.A_debug.dylib') == d('P', 'Foo.A_debug.dylib', 'Foo', 'A', 'debug') + +if __name__ == '__main__': + test_dylib_info() diff --git a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/framework.py b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/framework.py new file mode 100644 index 000000000000..ad6ed554ba0c --- /dev/null +++ b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/macholib/framework.py @@ -0,0 +1,65 @@ +""" +Generic framework path manipulation +""" + +import re + +__all__ = ['framework_info'] + +STRICT_FRAMEWORK_RE = re.compile(r"""(?x) +(?P^.*)(?:^|/) +(?P + (?P\w+).framework/ + (?:Versions/(?P[^/]+)/)? + (?P=shortname) + (?:_(?P[^_]+))? +)$ +""") + +def framework_info(filename): + """ + A framework name can take one of the following four forms: + Location/Name.framework/Versions/SomeVersion/Name_Suffix + Location/Name.framework/Versions/SomeVersion/Name + Location/Name.framework/Name_Suffix + Location/Name.framework/Name + + returns None if not found, or a mapping equivalent to: + dict( + location='Location', + name='Name.framework/Versions/SomeVersion/Name_Suffix', + shortname='Name', + version='SomeVersion', + suffix='Suffix', + ) + + Note that SomeVersion and Suffix are optional and may be None + if not present + """ + is_framework = STRICT_FRAMEWORK_RE.match(filename) + if not is_framework: + return None + return is_framework.groupdict() + +def test_framework_info(): + def d(location=None, name=None, shortname=None, version=None, suffix=None): + return dict( + location=location, + name=name, + shortname=shortname, + version=version, + suffix=suffix + ) + assert framework_info('completely/invalid') is None + assert framework_info('completely/invalid/_debug') is None + assert framework_info('P/F.framework') is None + assert framework_info('P/F.framework/_debug') is None + assert framework_info('P/F.framework/F') == d('P', 'F.framework/F', 'F') + assert framework_info('P/F.framework/F_debug') == d('P', 'F.framework/F_debug', 'F', suffix='debug') + assert framework_info('P/F.framework/Versions') is None + assert framework_info('P/F.framework/Versions/A') is None + assert framework_info('P/F.framework/Versions/A/F') == d('P', 'F.framework/Versions/A/F', 'F', 'A') + assert framework_info('P/F.framework/Versions/A/F_debug') == d('P', 'F.framework/Versions/A/F_debug', 'F', 'A', 'debug') + +if __name__ == '__main__': + test_framework_info() diff --git a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/util.py b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/util.py new file mode 100644 index 000000000000..e72be2fb7174 --- /dev/null +++ b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/util.py @@ -0,0 +1,124 @@ +#@PydevCodeAnalysisIgnore +import sys +import os + +# find_library(name) returns the pathname of a library, or None. +if os.name == "nt": + def find_library(name): + # See MSDN for the REAL search order. + for directory in os.environ['PATH'].split(os.pathsep): + fname = os.path.join(directory, name) + if os.path.exists(fname): + return fname + if fname.lower().endswith(".dll"): + continue + fname = fname + ".dll" + if os.path.exists(fname): + return fname + return None + +if os.name == "ce": + # search path according to MSDN: + # - absolute path specified by filename + # - The .exe launch directory + # - the Windows directory + # - ROM dll files (where are they?) + # - OEM specified search path: HKLM\Loader\SystemPath + def find_library(name): + return name + +if os.name == "posix" and sys.platform == "darwin": + from ctypes.macholib.dyld import dyld_find as _dyld_find + def find_library(name): + possible = ['lib%s.dylib' % name, + '%s.dylib' % name, + '%s.framework/%s' % (name, name)] + for name in possible: + try: + return _dyld_find(name) + except ValueError: + continue + return None + +elif os.name == "posix": + # Andreas Degert's find functions, using gcc, /sbin/ldconfig, objdump + import re, tempfile + + def _findLib_gcc(name): + expr = '[^\(\)\s]*lib%s\.[^\(\)\s]*' % name + cmd = 'if type gcc &>/dev/null; then CC=gcc; else CC=cc; fi;' \ + '$CC -Wl,-t -o /dev/null 2>&1 -l' + name + try: + fdout, outfile = tempfile.mkstemp() + fd = os.popen(cmd) + trace = fd.read() + err = fd.close() + finally: + try: + os.unlink(outfile) + except OSError, e: + import errno + if e.errno != errno.ENOENT: + raise + res = re.search(expr, trace) + if not res: + return None + return res.group(0) + + def _findLib_ld(name): + expr = '/[^\(\)\s]*lib%s\.[^\(\)\s]*' % name + res = re.search(expr, os.popen('/sbin/ldconfig -p 2>/dev/null').read()) + if not res: + # Hm, this works only for libs needed by the python executable. + cmd = 'ldd %s 2>/dev/null' % sys.executable + res = re.search(expr, os.popen(cmd).read()) + if not res: + return None + return res.group(0) + + def _get_soname(f): + cmd = "objdump -p -j .dynamic 2>/dev/null " + f + res = re.search(r'\sSONAME\s+([^\s]+)', os.popen(cmd).read()) + if not res: + return None + return res.group(1) + + def find_library(name): + lib = _findLib_ld(name) or _findLib_gcc(name) + if not lib: + return None + return _get_soname(lib) + +################################################################ +# test code + +def test(): + from ctypes import cdll + if os.name == "nt": + sys.stdout.write('%s\n' % (cdll.msvcrt,)) + sys.stdout.write('%s\n' % (cdll.load("msvcrt"),)) + sys.stdout.write('%s\n' % (find_library("msvcrt"),)) + + if os.name == "posix": + # find and load_version + sys.stdout.write('%s\n' % (find_library("m"),)) + sys.stdout.write('%s\n' % (find_library("c"),)) + sys.stdout.write('%s\n' % (find_library("bz2"),)) + + # getattr +## print_ cdll.m +## print_ cdll.bz2 + + # load + if sys.platform == "darwin": + sys.stdout.write('%s\n' % (cdll.LoadLibrary("libm.dylib"),)) + sys.stdout.write('%s\n' % (cdll.LoadLibrary("libcrypto.dylib"),)) + sys.stdout.write('%s\n' % (cdll.LoadLibrary("libSystem.dylib"),)) + sys.stdout.write('%s\n' % (cdll.LoadLibrary("System.framework/System"),)) + else: + sys.stdout.write('%s\n' % (cdll.LoadLibrary("libm.so"),)) + sys.stdout.write('%s\n' % (cdll.LoadLibrary("libcrypt.so"),)) + sys.stdout.write('%s\n' % (find_library("crypt"),)) + +if __name__ == "__main__": + test() diff --git a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/wintypes.py b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/wintypes.py new file mode 100644 index 000000000000..d31f11e2bab8 --- /dev/null +++ b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/wintypes.py @@ -0,0 +1,98 @@ +#@PydevCodeAnalysisIgnore +# XXX This module needs cleanup. + +from ctypes import * + +DWORD = c_ulong +WORD = c_ushort +BYTE = c_byte + +ULONG = c_ulong +LONG = c_long + +LARGE_INTEGER = c_longlong +ULARGE_INTEGER = c_ulonglong + + +HANDLE = c_ulong # in the header files: void * + +HWND = HANDLE +HDC = HANDLE +HMODULE = HANDLE +HINSTANCE = HANDLE +HRGN = HANDLE +HTASK = HANDLE +HKEY = HANDLE +HPEN = HANDLE +HGDIOBJ = HANDLE +HMENU = HANDLE + +LCID = DWORD + +WPARAM = c_uint +LPARAM = c_long + +BOOL = c_long +VARIANT_BOOL = c_short + +LPCOLESTR = LPOLESTR = OLESTR = c_wchar_p +LPCWSTR = LPWSTR = c_wchar_p + +LPCSTR = LPSTR = c_char_p + +class RECT(Structure): + _fields_ = [("left", c_long), + ("top", c_long), + ("right", c_long), + ("bottom", c_long)] +RECTL = RECT + +class POINT(Structure): + _fields_ = [("x", c_long), + ("y", c_long)] +POINTL = POINT + +class SIZE(Structure): + _fields_ = [("cx", c_long), + ("cy", c_long)] +SIZEL = SIZE + +def RGB(red, green, blue): + return red + (green << 8) + (blue << 16) + +class FILETIME(Structure): + _fields_ = [("dwLowDateTime", DWORD), + ("dwHighDateTime", DWORD)] + +class MSG(Structure): + _fields_ = [("hWnd", HWND), + ("message", c_uint), + ("wParam", WPARAM), + ("lParam", LPARAM), + ("time", DWORD), + ("pt", POINT)] +MAX_PATH = 260 + +class WIN32_FIND_DATAA(Structure): + _fields_ = [("dwFileAttributes", DWORD), + ("ftCreationTime", FILETIME), + ("ftLastAccessTime", FILETIME), + ("ftLastWriteTime", FILETIME), + ("nFileSizeHigh", DWORD), + ("nFileSizeLow", DWORD), + ("dwReserved0", DWORD), + ("dwReserved1", DWORD), + ("cFileName", c_char * MAX_PATH), + ("cAlternameFileName", c_char * 14)] + +class WIN32_FIND_DATAW(Structure): + _fields_ = [("dwFileAttributes", DWORD), + ("ftCreationTime", FILETIME), + ("ftLastAccessTime", FILETIME), + ("ftLastWriteTime", FILETIME), + ("nFileSizeHigh", DWORD), + ("nFileSizeLow", DWORD), + ("dwReserved0", DWORD), + ("dwReserved1", DWORD), + ("cFileName", c_wchar * MAX_PATH), + ("cAlternameFileName", c_wchar * 14)] diff --git a/python/helpers/pydev/third_party/wrapped_for_pydev/not_in_default_pythonpath.txt b/python/helpers/pydev/third_party/wrapped_for_pydev/not_in_default_pythonpath.txt new file mode 100644 index 000000000000..24084e9d174c --- /dev/null +++ b/python/helpers/pydev/third_party/wrapped_for_pydev/not_in_default_pythonpath.txt @@ -0,0 +1 @@ +The wrapped_for_pydev folder is not in the default pythonpath... (no __init__.py file) \ No newline at end of file From 948b2e3048dbe664bd67b102f61aaaa3b227bec5 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Fri, 22 Aug 2014 15:58:39 +0200 Subject: [PATCH 02/97] Pydev updated to the latest dev version. --- python/helpers/pydev/README.md | 7 - python/helpers/pydev/_pydev_imports_tipper.py | 118 +-- .../helpers/pydev/_pydev_jy_imports_tipper.py | 168 ++- python/helpers/pydev/_pydev_threading.py | 989 +++++++++++++++++- python/helpers/pydev/_pydev_tipper_common.py | 29 +- python/helpers/pydev/django_debug.py | 1 + python/helpers/pydev/fix_getpass.py | 19 +- python/helpers/pydev/merge_pydev_pycharm.txt | 40 +- python/helpers/pydev/pycompletion.py | 6 +- python/helpers/pydev/pycompletionserver.py | 53 +- python/helpers/pydev/pydev_console_utils.py | 55 +- python/helpers/pydev/pydev_imports.py | 32 +- .../pydev/pydev_ipython/inputhookglut.py | 3 +- .../pydev/pydev_ipython/inputhookpyglet.py | 3 +- .../pydev/pydev_ipython/inputhookqt4.py | 6 +- .../pydev/pydev_ipython/inputhookwx.py | 2 +- python/helpers/pydev/pydev_ipython_console.py | 5 +- .../pydev/pydev_ipython_console_011.py | 46 +- python/helpers/pydev/pydev_localhost.py | 14 +- python/helpers/pydev/pydev_monkey.py | 119 +-- .../helpers/pydev/pydev_runfiles_parallel.py | 9 +- .../pydev/pydev_runfiles_parallel_client.py | 103 +- .../helpers/pydev/pydev_runfiles_pytest2.py | 6 +- .../helpers/pydev/pydev_runfiles_xml_rpc.py | 11 +- python/helpers/pydev/pydevconsole.py | 41 +- python/helpers/pydev/pydevd.py | 344 +++--- .../pydev/pydevd_additional_thread_info.py | 7 +- python/helpers/pydev/pydevd_breakpoints.py | 7 +- python/helpers/pydev/pydevd_comm.py | 115 +- python/helpers/pydev/pydevd_console.py | 56 +- python/helpers/pydev/pydevd_constants.py | 31 +- python/helpers/pydev/pydevd_custom_frames.py | 3 +- python/helpers/pydev/pydevd_file_utils.py | 4 + python/helpers/pydev/pydevd_frame.py | 11 +- python/helpers/pydev/pydevd_resolver.py | 97 +- python/helpers/pydev/pydevd_signature.py | 17 +- python/helpers/pydev/pydevd_stackless.py | 5 +- python/helpers/pydev/pydevd_tracing.py | 7 +- python/helpers/pydev/pydevd_vars.py | 14 +- python/helpers/pydev/runfiles.py | 7 +- .../helpers/pydev/tests/test_get_referrers.py | 15 + python/helpers/pydev/tests/test_jyserver.py | 8 - .../pydev/tests/test_jysimpleTipper.py | 41 +- .../pydev/tests/test_pydev_ipython_011.py | 217 ++-- .../helpers/pydev/tests/test_pydevconsole.py | 283 +++-- python/helpers/pydev/tests/test_pyserver.py | 22 +- .../helpers/pydev/tests/test_simpleTipper.py | 38 +- .../helpers/pydev/tests_mainloop/gui-glut.py | 78 +- .../helpers/pydev/tests_mainloop/gui-gtk.py | 49 +- .../helpers/pydev/tests_mainloop/gui-gtk3.py | 45 +- .../pydev/tests_mainloop/gui-pyglet.py | 35 +- python/helpers/pydev/tests_mainloop/gui-qt.py | 44 +- python/helpers/pydev/tests_mainloop/gui-tk.py | 44 +- python/helpers/pydev/tests_mainloop/gui-wx.py | 174 ++- .../pydev/tests_python/_debugger_case18.py | 4 +- .../pydev/tests_python/_debugger_case19.py | 2 +- .../pydev/tests_python/_debugger_case7.py | 2 +- .../pydev/tests_python/_debugger_case89.py | 12 +- .../test_additional_thread_info.py | 26 +- .../pydev/tests_python/test_debugger.py | 656 ++++-------- .../pydev/tests_python/test_pydev_monkey.py | 22 +- .../pydev/tests_python/test_save_locals.py | 6 +- .../pydev/tests_runfiles/test_runfiles.py | 65 +- .../pep8/lib2to3/lib2to3/fixer_util.py | 2 + .../pep8/lib2to3/lib2to3/fixes/fix_dict.py | 3 +- .../pep8/lib2to3/lib2to3/fixes/fix_exec.py | 1 + .../pep8/lib2to3/lib2to3/fixes/fix_filter.py | 1 + .../pep8/lib2to3/lib2to3/fixes/fix_has_key.py | 1 + .../lib2to3/lib2to3/fixes/fix_metaclass.py | 2 +- .../pep8/lib2to3/lib2to3/fixes/fix_nonzero.py | 2 +- .../pep8/lib2to3/lib2to3/fixes/fix_print.py | 2 +- .../pep8/lib2to3/lib2to3/fixes/fix_types.py | 1 + .../pep8/lib2to3/lib2to3/fixes/fix_urllib.py | 1 + .../pep8/lib2to3/lib2to3/pgen2/grammar.py | 2 +- .../pep8/lib2to3/lib2to3/pgen2/tokenize.py | 5 +- .../pep8/lib2to3/lib2to3/pygram.py | 2 + .../pep8/lib2to3/lib2to3/refactor.py | 1 + .../wrapped_for_pydev/ctypes/__init__.py | 12 +- .../wrapped_for_pydev/ctypes/util.py | 4 +- 79 files changed, 2503 insertions(+), 2037 deletions(-) diff --git a/python/helpers/pydev/README.md b/python/helpers/pydev/README.md index 17df01ca8113..7b221164e66f 100644 --- a/python/helpers/pydev/README.md +++ b/python/helpers/pydev/README.md @@ -1,9 +1,2 @@ PyDev.Debugger ============== - -[![Build Status](https://travis-ci.org/fabioz/PyDev.Debugger.png)](https://travis-ci.org/fabioz/PyDev.Debugger) - -This repository contains the sources for the Debugger used in PyDev & PyCharm. - -It should be compatible with Python 2.4 onwards (as well as Jython 2.2.1, IronPython and PyPy -- and any -other variant which properly supports the Python structure for debuggers -- i.e.: sys.settrace/threading.settrace). \ No newline at end of file diff --git a/python/helpers/pydev/_pydev_imports_tipper.py b/python/helpers/pydev/_pydev_imports_tipper.py index 76cf2cdc473f..e4b3b863f210 100644 --- a/python/helpers/pydev/_pydev_imports_tipper.py +++ b/python/helpers/pydev/_pydev_imports_tipper.py @@ -4,10 +4,6 @@ import sys from _pydev_tipper_common import DoFind -try: - xrange -except: - xrange = range #completion types. TYPE_IMPORT = '0' @@ -23,20 +19,20 @@ def _imp(name, log=None): except: if '.' in name: sub = name[0:name.rfind('.')] - + if log is not None: log.AddContent('Unable to import', name, 'trying with', sub) log.AddException() - + return _imp(sub, log) else: s = 'Unable to import module: %s - sys.path: %s' % (str(name), sys.path) if log is not None: log.AddContent(s) log.AddException() - + raise ImportError(s) - + IS_IPY = False if sys.platform == 'cli': @@ -57,9 +53,9 @@ if sys.platform == 'cli': clr.AddReference(name) except: pass #That's OK (not dot net module). - + return _old_imp(initial_name, log) - + def GetFile(mod): @@ -73,19 +69,19 @@ def GetFile(mod): filename = f[:-4] + '.py' if os.path.exists(filename): f = filename - + return f def Find(name, log=None): f = None - + mod = _imp(name, log) parent = mod foundAs = '' - + if inspect.ismodule(mod): f = GetFile(mod) - + components = name.split('.') old_comp = None @@ -98,22 +94,22 @@ def Find(name, log=None): except AttributeError: if old_comp != comp: raise - + if inspect.ismodule(mod): f = GetFile(mod) else: if len(foundAs) > 0: foundAs = foundAs + '.' foundAs = foundAs + comp - + old_comp = comp - + return f, mod, parent, foundAs def Search(data): '''@return file, line, col ''' - + data = data.replace('\n', '') if data.endswith('.'): data = data.rstrip('.') @@ -122,19 +118,19 @@ def Search(data): return DoFind(f, mod), foundAs except: return DoFind(f, parent), foundAs - - + + def GenerateTip(data, log=None): data = data.replace('\n', '') if data.endswith('.'): data = data.rstrip('.') - + f, mod, parent, foundAs = Find(data, log) #print_ >> open('temp.txt', 'w'), f tips = GenerateImportsTipForModule(mod) return f, tips - - + + def CheckChar(c): if c == '-' or c == '.': return '_' @@ -150,7 +146,7 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, name, doc, args, type (from the TYPE_* constants) ''' ret = [] - + if dirComps is None: dirComps = dir(obj_to_complete) if hasattr(obj_to_complete, '__dict__'): @@ -159,22 +155,22 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, dirComps.append('__class__') getCompleteInfo = True - + if len(dirComps) > 1000: - #ok, we don't want to let our users wait forever... + #ok, we don't want to let our users wait forever... #no complete info for you... - + getCompleteInfo = False - + dontGetDocsOn = (float, int, str, tuple, list) for d in dirComps: - + if d is None: continue - + if not filter(d): continue - + args = '' try: @@ -186,18 +182,18 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, if getCompleteInfo: try: retType = TYPE_BUILTIN - + #check if we have to get docs getDoc = True for class_ in dontGetDocsOn: - + if isinstance(obj, class_): getDoc = False break - + doc = '' if getDoc: - #no need to get this info... too many constants are defined and + #no need to get this info... too many constants are defined and #makes things much slower (passing all that through sockets takes quite some time) try: doc = inspect.getdoc(obj) @@ -205,12 +201,12 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, doc = '' except: #may happen on jython when checking java classes (so, just ignore it) doc = '' - - + + if inspect.ismethod(obj) or inspect.isbuiltin(obj) or inspect.isfunction(obj) or inspect.isroutine(obj): try: args, vargs, kwargs, defaults = inspect.getargspec(obj) - + r = '' for a in (args): if len(r) > 0: @@ -254,7 +250,7 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, if major: args = major[major.index('('):] found = True - + if not found: i = doc.find('->') @@ -264,12 +260,12 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, i = doc.find('\n') if i < 0: i = doc.find('\r') - - + + if i > 0: s = doc[0:i] s = s.strip() - + #let's see if we have a docstring in the first line if s[-1] == ')': start = s.find('(') @@ -279,21 +275,21 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, end = s.find(')') if end <= 0: end = len(s) - + args = s[start:end] if not args[-1] == ')': args = args + ')' - - + + #now, get rid of unwanted chars l = len(args) - 1 r = [] - for i in xrange(len(args)): + for i in range(len(args)): if i == 0 or i == l: r.append(args[i]) else: r.append(CheckChar(args[i])) - + args = ''.join(r) if IS_IPY: @@ -309,43 +305,43 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, except: pass - + retType = TYPE_FUNCTION - + elif inspect.isclass(obj): retType = TYPE_CLASS - + elif inspect.ismodule(obj): retType = TYPE_IMPORT - + else: retType = TYPE_ATTR - - + + #add token and doc to return - assure only strings. ret.append((d, doc, args, retType)) - + except: #just ignore and get it without aditional info ret.append((d, '', args, TYPE_BUILTIN)) - + else: #getCompleteInfo == False if inspect.ismethod(obj) or inspect.isbuiltin(obj) or inspect.isfunction(obj) or inspect.isroutine(obj): retType = TYPE_FUNCTION - + elif inspect.isclass(obj): retType = TYPE_CLASS - + elif inspect.ismodule(obj): retType = TYPE_IMPORT - + else: retType = TYPE_ATTR #ok, no complete info, let's try to do this as fast and clean as possible #so, no docs for this kind of information, only the signatures ret.append((d, '', str(args), retType)) - + return ret - - + + diff --git a/python/helpers/pydev/_pydev_jy_imports_tipper.py b/python/helpers/pydev/_pydev_jy_imports_tipper.py index 1691e3e1f1dc..7a957e03b02a 100644 --- a/python/helpers/pydev/_pydev_jy_imports_tipper.py +++ b/python/helpers/pydev/_pydev_jy_imports_tipper.py @@ -1,5 +1,7 @@ import StringIO import traceback +from java.lang import StringBuffer #@UnresolvedImport +from java.lang import String #@UnresolvedImport import java.lang #@UnresolvedImport import sys from _pydev_tipper_common import DoFind @@ -12,16 +14,12 @@ except NameError: # version < 2.3 -- didn't have the True/False builtins import __builtin__ setattr(__builtin__, 'True', 1) setattr(__builtin__, 'False', 0) - - + + from org.python.core import PyReflectedFunction #@UnresolvedImport from org.python import core #@UnresolvedImport - -try: - xrange -except: - xrange = range +from org.python.core import PyClass #@UnresolvedImport #completion types. @@ -50,11 +48,11 @@ def Find(name): name = 'org.python.core.PyString' elif name == '__builtin__.dict': name = 'org.python.core.PyDictionary' - + mod = _imp(name) parent = mod foundAs = '' - + if hasattr(mod, '__file__'): f = mod.__file__ @@ -70,29 +68,29 @@ def Find(name): except AttributeError: if old_comp != comp: raise - + if hasattr(mod, '__file__'): f = mod.__file__ else: if len(foundAs) > 0: foundAs = foundAs + '.' foundAs = foundAs + comp - + old_comp = comp - + return f, mod, parent, foundAs def formatParamClassName(paramClassName): if paramClassName.startswith('['): if paramClassName == '[C': paramClassName = 'char[]' - + elif paramClassName == '[B': paramClassName = 'byte[]' - + elif paramClassName == '[I': paramClassName = 'int[]' - + elif paramClassName.startswith('[L') and paramClassName.endswith(';'): paramClassName = paramClassName[2:-1] paramClassName += '[]' @@ -103,17 +101,17 @@ def GenerateTip(data, log=None): data = data.replace('\n', '') if data.endswith('.'): data = data.rstrip('.') - + f, mod, parent, foundAs = Find(data) tips = GenerateImportsTipForModule(mod) return f, tips - + #======================================================================================================================= # Info #======================================================================================================================= class Info: - + def __init__(self, name, **kwargs): self.name = name self.doc = kwargs.get('doc', None) @@ -121,47 +119,47 @@ class Info: self.varargs = kwargs.get('varargs', None) #string self.kwargs = kwargs.get('kwargs', None) #string self.ret = kwargs.get('ret', None) #string - + def basicAsStr(self): '''@returns this class information as a string (just basic format) ''' - + s = 'function:%s args=%s, varargs=%s, kwargs=%s, docs:%s' % \ (str(self.name), str(self.args), str(self.varargs), str(self.kwargs), str(self.doc)) return s - + def getAsDoc(self): s = str(self.name) if self.doc: s += '\n@doc %s\n' % str(self.doc) - + if self.args: s += '\n@params ' for arg in self.args: s += str(formatParamClassName(arg)) s += ' ' - + if self.varargs: s += '\n@varargs ' s += str(self.varargs) - + if self.kwargs: s += '\n@kwargs ' s += str(self.kwargs) - + if self.ret: s += '\n@return ' s += str(formatParamClassName(str(self.ret))) - + return str(s) - + def isclass(cls): return isinstance(cls, core.PyClass) def ismethod(func): '''this function should return the information gathered on a function - + @param func: this is the function we want to get info on @return a tuple where: 0 = indicates whether the parameter passed is a method or not @@ -169,24 +167,24 @@ def ismethod(func): this is a list because when we have methods from java with the same name and different signatures, we actually have many methods, each with its own set of arguments ''' - + try: if isinstance(func, core.PyFunction): #ok, this is from python, created by jython #print_ ' PyFunction' - + def getargs(func_code): """Get information about the arguments accepted by a code object. - + Three things are returned: (args, varargs, varkw), where 'args' is a list of argument names (possibly containing nested lists), and 'varargs' and 'varkw' are the names of the * and ** arguments or None.""" - + nargs = func_code.co_argcount names = func_code.co_varnames args = list(names[:nargs]) step = 0 - + varargs = None if func_code.co_flags & func_code.CO_VARARGS: varargs = func_code.co_varnames[nargs] @@ -195,35 +193,35 @@ def ismethod(func): if func_code.co_flags & func_code.CO_VARKEYWORDS: varkw = func_code.co_varnames[nargs] return args, varargs, varkw - + args = getargs(func.func_code) return 1, [Info(func.func_name, args=args[0], varargs=args[1], kwargs=args[2], doc=func.func_doc)] - + if isinstance(func, core.PyMethod): #this is something from java itself, and jython just wrapped it... - + #things to play in func: #['__call__', '__class__', '__cmp__', '__delattr__', '__dir__', '__doc__', '__findattr__', '__name__', '_doget', 'im_class', #'im_func', 'im_self', 'toString'] #print_ ' PyMethod' #that's the PyReflectedFunction... keep going to get it func = func.im_func - + if isinstance(func, PyReflectedFunction): #this is something from java itself, and jython just wrapped it... - + #print_ ' PyReflectedFunction' - + infos = [] - for i in xrange(len(func.argslist)): + for i in range(len(func.argslist)): #things to play in func.argslist[i]: - + #'PyArgsCall', 'PyArgsKeywordsCall', 'REPLACE', 'StandardCall', 'args', 'compare', 'compareTo', 'data', 'declaringClass' #'flags', 'isStatic', 'matches', 'precedence'] - + #print_ ' ', func.argslist[i].data.__class__ #func.argslist[i].data.__class__ == java.lang.reflect.Method - + if func.argslist[i]: met = func.argslist[i].data name = met.getName() @@ -232,9 +230,9 @@ def ismethod(func): except AttributeError: ret = '' parameterTypes = met.getParameterTypes() - + args = [] - for j in xrange(len(parameterTypes)): + for j in range(len(parameterTypes)): paramTypesClass = parameterTypes[j] try: try: @@ -248,7 +246,7 @@ def ismethod(func): except: paramClassName = repr(paramTypesClass) #just in case something else happens... it will at least be visible #if the parameter equals [C, it means it it a char array, so, let's change it - + a = formatParamClassName(paramClassName) #a = a.replace('[]','Array') #a = a.replace('Object', 'obj') @@ -257,18 +255,18 @@ def ismethod(func): #a = a.replace('Char', 'c') #a = a.replace('Double', 'd') args.append(a) #so we don't leave invalid code - - + + info = Info(name, args=args, ret=ret) #print_ info.basicAsStr() infos.append(info) - + return 1, infos except Exception: s = StringIO.StringIO() traceback.print_exc(file=s) return 1, [Info(str('ERROR'), doc=s.getvalue())] - + return 0, None def ismodule(mod): @@ -276,7 +274,7 @@ def ismodule(mod): if not hasattr(mod, 'getClass') and not hasattr(mod, '__class__') \ and hasattr(mod, '__name__'): return 1 - + return isinstance(mod, core.PyModule) @@ -295,11 +293,11 @@ def dirObj(obj): except TypeError: #may happen on jython when getting the java.lang.Class class c = obj.getSuperclass(obj) - + while c != None: classes.append(c) c = c.getSuperclass() - + #get info about interfaces interfs = [] for obj in classes: @@ -308,57 +306,57 @@ def dirObj(obj): except TypeError: interfs.extend(obj.getInterfaces(obj)) classes.extend(interfs) - + #now is the time when we actually get info on the declared methods and fields for obj in classes: try: declaredMethods = obj.getDeclaredMethods() except TypeError: declaredMethods = obj.getDeclaredMethods(obj) - + try: declaredFields = obj.getDeclaredFields() except TypeError: declaredFields = obj.getDeclaredFields(obj) - - for i in xrange(len(declaredMethods)): + + for i in range(len(declaredMethods)): name = declaredMethods[i].getName() ret.append(name) found.put(name, 1) - - for i in xrange(len(declaredFields)): + + for i in range(len(declaredFields)): name = declaredFields[i].getName() ret.append(name) found.put(name, 1) - - - elif isclass(obj.__class__): + + + elif isclass(obj.__class__): d = dir(obj.__class__) for name in d: ret.append(name) found.put(name, 1) - + #this simple dir does not always get all the info, that's why we have the part before - #(e.g.: if we do a dir on String, some methods that are from other interfaces such as + #(e.g.: if we do a dir on String, some methods that are from other interfaces such as #charAt don't appear) d = dir(original) for name in d: if found.get(name) != 1: ret.append(name) - + return ret def formatArg(arg): '''formats an argument to be shown ''' - + s = str(arg) dot = s.rfind('.') if dot >= 0: s = s[dot + 1:] - + s = s.replace(';', '') s = s.replace('[]', 'Array') if len(s) > 0: @@ -366,13 +364,13 @@ def formatArg(arg): s = c + s[1:] return s - - - + + + def Search(data): '''@return file, line, col ''' - + data = data.replace('\n', '') if data.endswith('.'): data = data.rstrip('.') @@ -381,8 +379,8 @@ def Search(data): return DoFind(f, mod), foundAs except: return DoFind(f, parent), foundAs - - + + def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, filter=lambda name:True): ''' @param obj_to_complete: the object from where we should get the completions @@ -393,18 +391,18 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, name, doc, args, type (from the TYPE_* constants) ''' ret = [] - + if dirComps is None: dirComps = dirObj(obj_to_complete) - + for d in dirComps: if d is None: continue - + if not filter(d): continue - + args = '' doc = '' retType = TYPE_BUILTIN @@ -423,7 +421,7 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, #note: this only happens when we add things to the sys.path at runtime, if they are added to the classpath #before the run, everything goes fine. # - #The code below ilustrates what I mean... + #The code below ilustrates what I mean... # #import sys #sys.path.insert(1, r"C:\bin\eclipse310\plugins\org.junit_3.8.1\junit.jar" ) @@ -431,7 +429,7 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, #import junit.framework #print_ dir(junit.framework) #shows the TestCase class here # - #import junit.framework.TestCase + #import junit.framework.TestCase # #raises the error: #Traceback (innermost last): @@ -460,19 +458,19 @@ def GenerateImportsTipForModule(obj_to_complete, dirComps=None, getattr=getattr, except TypeError: traceback.print_exc() args = '()' - + retType = TYPE_FUNCTION - + elif isclass(obj): retType = TYPE_CLASS - + elif ismodule(obj): retType = TYPE_IMPORT - + #add token and doc to return - assure only strings. ret.append((d, doc, args, retType)) - - + + return ret diff --git a/python/helpers/pydev/_pydev_threading.py b/python/helpers/pydev/_pydev_threading.py index 5d59b2baeedc..52d48c93ed3e 100644 --- a/python/helpers/pydev/_pydev_threading.py +++ b/python/helpers/pydev/_pydev_threading.py @@ -1,13 +1,982 @@ -try: - from threading import settrace -except: - pass +"""Thread module emulating a subset of Java's threading model.""" +import sys as _sys try: - from gevent import monkey - saved = monkey.saved['threading'] - for key, val in saved.items(): - globals()[key] = val -except: - pass + import _pydev_thread as thread +except ImportError: + import thread + +import warnings + +from _pydev_time import time as _time, sleep as _sleep +from traceback import format_exc as _format_exc + +# Note regarding PEP 8 compliant aliases +# This threading model was originally inspired by Java, and inherited +# the convention of camelCase function and method names from that +# language. While those names are not in any imminent danger of being +# deprecated, starting with Python 2.6, the module now provides a +# PEP 8 compliant alias for any such method name. +# Using the new PEP 8 compliant names also facilitates substitution +# with the multiprocessing module, which doesn't provide the old +# Java inspired names. + + +# Rename some stuff so "from threading import *" is safe +__all__ = ['activeCount', 'active_count', 'Condition', 'currentThread', + 'current_thread', 'enumerate', 'Event', + 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', + 'Timer', 'setprofile', 'settrace', 'local', 'stack_size'] + +_start_new_thread = thread.start_new_thread +_allocate_lock = thread.allocate_lock +_get_ident = thread.get_ident +ThreadError = thread.error +del thread + + +# sys.exc_clear is used to work around the fact that except blocks +# don't fully clear the exception until 3.0. +warnings.filterwarnings('ignore', category=DeprecationWarning, + module='threading', message='sys.exc_clear') + +# Debug support (adapted from ihooks.py). +# All the major classes here derive from _Verbose. We force that to +# be a new-style class so that all the major classes here are new-style. +# This helps debugging (type(instance) is more revealing for instances +# of new-style classes). + +_VERBOSE = False + +if __debug__: + + class _Verbose(object): + + def __init__(self, verbose=None): + if verbose is None: + verbose = _VERBOSE + self.__verbose = verbose + + def _note(self, format, *args): + if self.__verbose: + format = format % args + # Issue #4188: calling current_thread() can incur an infinite + # recursion if it has to create a DummyThread on the fly. + ident = _get_ident() + try: + name = _active[ident].name + except KeyError: + name = "" % ident + format = "%s: %s\n" % (name, format) + _sys.stderr.write(format) + +else: + # Disable this when using "python -O" + class _Verbose(object): + def __init__(self, verbose=None): + pass + def _note(self, *args): + pass + +# Support for profile and trace hooks + +_profile_hook = None +_trace_hook = None + +def setprofile(func): + global _profile_hook + _profile_hook = func + +def settrace(func): + global _trace_hook + _trace_hook = func + +# Synchronization classes + +Lock = _allocate_lock + +def RLock(*args, **kwargs): + return _RLock(*args, **kwargs) + +class _RLock(_Verbose): + + def __init__(self, verbose=None): + _Verbose.__init__(self, verbose) + self.__block = _allocate_lock() + self.__owner = None + self.__count = 0 + + def __repr__(self): + owner = self.__owner + try: + owner = _active[owner].name + except KeyError: + pass + return "<%s owner=%r count=%d>" % ( + self.__class__.__name__, owner, self.__count) + + def acquire(self, blocking=1): + me = _get_ident() + if self.__owner == me: + self.__count = self.__count + 1 + if __debug__: + self._note("%s.acquire(%s): recursive success", self, blocking) + return 1 + rc = self.__block.acquire(blocking) + if rc: + self.__owner = me + self.__count = 1 + if __debug__: + self._note("%s.acquire(%s): initial success", self, blocking) + else: + if __debug__: + self._note("%s.acquire(%s): failure", self, blocking) + return rc + + __enter__ = acquire + + def release(self): + if self.__owner != _get_ident(): + raise RuntimeError("cannot release un-acquired lock") + self.__count = count = self.__count - 1 + if not count: + self.__owner = None + self.__block.release() + if __debug__: + self._note("%s.release(): final release", self) + else: + if __debug__: + self._note("%s.release(): non-final release", self) + + def __exit__(self, t, v, tb): + self.release() + + # Internal methods used by condition variables + + def _acquire_restore(self, count_owner): + count, owner = count_owner + self.__block.acquire() + self.__count = count + self.__owner = owner + if __debug__: + self._note("%s._acquire_restore()", self) + + def _release_save(self): + if __debug__: + self._note("%s._release_save()", self) + count = self.__count + self.__count = 0 + owner = self.__owner + self.__owner = None + self.__block.release() + return (count, owner) + + def _is_owned(self): + return self.__owner == _get_ident() + + +def Condition(*args, **kwargs): + return _Condition(*args, **kwargs) + +class _Condition(_Verbose): + + def __init__(self, lock=None, verbose=None): + _Verbose.__init__(self, verbose) + if lock is None: + lock = RLock() + self.__lock = lock + # Export the lock's acquire() and release() methods + self.acquire = lock.acquire + self.release = lock.release + # If the lock defines _release_save() and/or _acquire_restore(), + # these override the default implementations (which just call + # release() and acquire() on the lock). Ditto for _is_owned(). + try: + self._release_save = lock._release_save + except AttributeError: + pass + try: + self._acquire_restore = lock._acquire_restore + except AttributeError: + pass + try: + self._is_owned = lock._is_owned + except AttributeError: + pass + self.__waiters = [] + + def __enter__(self): + return self.__lock.__enter__() + + def __exit__(self, *args): + return self.__lock.__exit__(*args) + + def __repr__(self): + return "" % (self.__lock, len(self.__waiters)) + + def _release_save(self): + self.__lock.release() # No state to save + + def _acquire_restore(self, x): + self.__lock.acquire() # Ignore saved state + + def _is_owned(self): + # Return True if lock is owned by current_thread. + # This method is called only if __lock doesn't have _is_owned(). + if self.__lock.acquire(0): + self.__lock.release() + return False + else: + return True + + def wait(self, timeout=None): + if not self._is_owned(): + raise RuntimeError("cannot wait on un-acquired lock") + waiter = _allocate_lock() + waiter.acquire() + self.__waiters.append(waiter) + saved_state = self._release_save() + try: # restore state no matter what (e.g., KeyboardInterrupt) + if timeout is None: + waiter.acquire() + if __debug__: + self._note("%s.wait(): got it", self) + else: + # Balancing act: We can't afford a pure busy loop, so we + # have to sleep; but if we sleep the whole timeout time, + # we'll be unresponsive. The scheme here sleeps very + # little at first, longer as time goes on, but never longer + # than 20 times per second (or the timeout time remaining). + endtime = _time() + timeout + delay = 0.0005 # 500 us -> initial delay of 1 ms + while True: + gotit = waiter.acquire(0) + if gotit: + break + remaining = endtime - _time() + if remaining <= 0: + break + delay = min(delay * 2, remaining, .05) + _sleep(delay) + if not gotit: + if __debug__: + self._note("%s.wait(%s): timed out", self, timeout) + try: + self.__waiters.remove(waiter) + except ValueError: + pass + else: + if __debug__: + self._note("%s.wait(%s): got it", self, timeout) + finally: + self._acquire_restore(saved_state) + + def notify(self, n=1): + if not self._is_owned(): + raise RuntimeError("cannot notify on un-acquired lock") + __waiters = self.__waiters + waiters = __waiters[:n] + if not waiters: + if __debug__: + self._note("%s.notify(): no waiters", self) + return + self._note("%s.notify(): notifying %d waiter%s", self, n, + n!=1 and "s" or "") + for waiter in waiters: + waiter.release() + try: + __waiters.remove(waiter) + except ValueError: + pass + + def notifyAll(self): + self.notify(len(self.__waiters)) + + notify_all = notifyAll + + +def Semaphore(*args, **kwargs): + return _Semaphore(*args, **kwargs) + +class _Semaphore(_Verbose): + + # After Tim Peters' semaphore class, but not quite the same (no maximum) + + def __init__(self, value=1, verbose=None): + if value < 0: + raise ValueError("semaphore initial value must be >= 0") + _Verbose.__init__(self, verbose) + self.__cond = Condition(Lock()) + self.__value = value + + def acquire(self, blocking=1): + rc = False + self.__cond.acquire() + while self.__value == 0: + if not blocking: + break + if __debug__: + self._note("%s.acquire(%s): blocked waiting, value=%s", + self, blocking, self.__value) + self.__cond.wait() + else: + self.__value = self.__value - 1 + if __debug__: + self._note("%s.acquire: success, value=%s", + self, self.__value) + rc = True + self.__cond.release() + return rc + + __enter__ = acquire + + def release(self): + self.__cond.acquire() + self.__value = self.__value + 1 + if __debug__: + self._note("%s.release: success, value=%s", + self, self.__value) + self.__cond.notify() + self.__cond.release() + + def __exit__(self, t, v, tb): + self.release() + + +def BoundedSemaphore(*args, **kwargs): + return _BoundedSemaphore(*args, **kwargs) + +class _BoundedSemaphore(_Semaphore): + """Semaphore that checks that # releases is <= # acquires""" + def __init__(self, value=1, verbose=None): + _Semaphore.__init__(self, value, verbose) + self._initial_value = value + + def release(self): + if self._Semaphore__value >= self._initial_value: + raise ValueError, "Semaphore released too many times" + return _Semaphore.release(self) + + +def Event(*args, **kwargs): + return _Event(*args, **kwargs) + +class _Event(_Verbose): + + # After Tim Peters' event class (without is_posted()) + + def __init__(self, verbose=None): + _Verbose.__init__(self, verbose) + self.__cond = Condition(Lock()) + self.__flag = False + + def _reset_internal_locks(self): + # private! called by Thread._reset_internal_locks by _after_fork() + self.__cond.__init__() + + def isSet(self): + return self.__flag + + is_set = isSet + + def set(self): + self.__cond.acquire() + try: + self.__flag = True + self.__cond.notify_all() + finally: + self.__cond.release() + + def clear(self): + self.__cond.acquire() + try: + self.__flag = False + finally: + self.__cond.release() + + def wait(self, timeout=None): + self.__cond.acquire() + try: + if not self.__flag: + self.__cond.wait(timeout) + return self.__flag + finally: + self.__cond.release() + +# Helper to generate new thread names +_counter = 0 +def _newname(template="Thread-%d"): + global _counter + _counter = _counter + 1 + return template % _counter + +# Active thread administration +_active_limbo_lock = _allocate_lock() +_active = {} # maps thread id to Thread object +_limbo = {} + + +# Main class for threads + +class Thread(_Verbose): + + __initialized = False + # Need to store a reference to sys.exc_info for printing + # out exceptions when a thread tries to use a global var. during interp. + # shutdown and thus raises an exception about trying to perform some + # operation on/with a NoneType + __exc_info = _sys.exc_info + # Keep sys.exc_clear too to clear the exception just before + # allowing .join() to return. + __exc_clear = _sys.exc_clear + + def __init__(self, group=None, target=None, name=None, + args=(), kwargs=None, verbose=None): + assert group is None, "group argument must be None for now" + _Verbose.__init__(self, verbose) + if kwargs is None: + kwargs = {} + self.__target = target + self.__name = str(name or _newname()) + self.__args = args + self.__kwargs = kwargs + self.__daemonic = self._set_daemon() + self.__ident = None + self.__started = Event() + self.__stopped = False + self.__block = Condition(Lock()) + self.__initialized = True + # sys.stderr is not stored in the class like + # sys.exc_info since it can be changed between instances + self.__stderr = _sys.stderr + + def _reset_internal_locks(self): + # private! Called by _after_fork() to reset our internal locks as + # they may be in an invalid state leading to a deadlock or crash. + if hasattr(self, '_Thread__block'): # DummyThread deletes self.__block + self.__block.__init__() + self.__started._reset_internal_locks() + + @property + def _block(self): + # used by a unittest + return self.__block + + def _set_daemon(self): + # Overridden in _MainThread and _DummyThread + return current_thread().daemon + + def __repr__(self): + assert self.__initialized, "Thread.__init__() was not called" + status = "initial" + if self.__started.is_set(): + status = "started" + if self.__stopped: + status = "stopped" + if self.__daemonic: + status += " daemon" + if self.__ident is not None: + status += " %s" % self.__ident + return "<%s(%s, %s)>" % (self.__class__.__name__, self.__name, status) + + def start(self): + if not self.__initialized: + raise RuntimeError("thread.__init__() not called") + if self.__started.is_set(): + raise RuntimeError("threads can only be started once") + if __debug__: + self._note("%s.start(): starting thread", self) + with _active_limbo_lock: + _limbo[self] = self + try: + _start_new_thread(self.__bootstrap, ()) + except Exception: + with _active_limbo_lock: + del _limbo[self] + raise + self.__started.wait() + + def run(self): + try: + if self.__target: + self.__target(*self.__args, **self.__kwargs) + finally: + # Avoid a refcycle if the thread is running a function with + # an argument that has a member that points to the thread. + del self.__target, self.__args, self.__kwargs + + def __bootstrap(self): + # Wrapper around the real bootstrap code that ignores + # exceptions during interpreter cleanup. Those typically + # happen when a daemon thread wakes up at an unfortunate + # moment, finds the world around it destroyed, and raises some + # random exception *** while trying to report the exception in + # __bootstrap_inner() below ***. Those random exceptions + # don't help anybody, and they confuse users, so we suppress + # them. We suppress them only when it appears that the world + # indeed has already been destroyed, so that exceptions in + # __bootstrap_inner() during normal business hours are properly + # reported. Also, we only suppress them for daemonic threads; + # if a non-daemonic encounters this, something else is wrong. + try: + self.__bootstrap_inner() + except: + if self.__daemonic and _sys is None: + return + raise + + def _set_ident(self): + self.__ident = _get_ident() + + def __bootstrap_inner(self): + try: + self._set_ident() + self.__started.set() + with _active_limbo_lock: + _active[self.__ident] = self + del _limbo[self] + if __debug__: + self._note("%s.__bootstrap(): thread started", self) + + if _trace_hook: + self._note("%s.__bootstrap(): registering trace hook", self) + _sys.settrace(_trace_hook) + if _profile_hook: + self._note("%s.__bootstrap(): registering profile hook", self) + _sys.setprofile(_profile_hook) + + try: + self.run() + except SystemExit: + if __debug__: + self._note("%s.__bootstrap(): raised SystemExit", self) + except: + if __debug__: + self._note("%s.__bootstrap(): unhandled exception", self) + # If sys.stderr is no more (most likely from interpreter + # shutdown) use self.__stderr. Otherwise still use sys (as in + # _sys) in case sys.stderr was redefined since the creation of + # self. + if _sys: + _sys.stderr.write("Exception in thread %s:\n%s\n" % + (self.name, _format_exc())) + else: + # Do the best job possible w/o a huge amt. of code to + # approximate a traceback (code ideas from + # Lib/traceback.py) + exc_type, exc_value, exc_tb = self.__exc_info() + try: + print>>self.__stderr, ( + "Exception in thread " + self.name + + " (most likely raised during interpreter shutdown):") + print>>self.__stderr, ( + "Traceback (most recent call last):") + while exc_tb: + print>>self.__stderr, ( + ' File "%s", line %s, in %s' % + (exc_tb.tb_frame.f_code.co_filename, + exc_tb.tb_lineno, + exc_tb.tb_frame.f_code.co_name)) + exc_tb = exc_tb.tb_next + print>>self.__stderr, ("%s: %s" % (exc_type, exc_value)) + # Make sure that exc_tb gets deleted since it is a memory + # hog; deleting everything else is just for thoroughness + finally: + del exc_type, exc_value, exc_tb + else: + if __debug__: + self._note("%s.__bootstrap(): normal return", self) + finally: + # Prevent a race in + # test_threading.test_no_refcycle_through_target when + # the exception keeps the target alive past when we + # assert that it's dead. + self.__exc_clear() + finally: + with _active_limbo_lock: + self.__stop() + try: + # We don't call self.__delete() because it also + # grabs _active_limbo_lock. + del _active[_get_ident()] + except: + pass + + def __stop(self): + self.__block.acquire() + self.__stopped = True + self.__block.notify_all() + self.__block.release() + + def __delete(self): + "Remove current thread from the dict of currently running threads." + + # Notes about running with dummy_thread: + # + # Must take care to not raise an exception if dummy_thread is being + # used (and thus this module is being used as an instance of + # dummy_threading). dummy_thread.get_ident() always returns -1 since + # there is only one thread if dummy_thread is being used. Thus + # len(_active) is always <= 1 here, and any Thread instance created + # overwrites the (if any) thread currently registered in _active. + # + # An instance of _MainThread is always created by 'threading'. This + # gets overwritten the instant an instance of Thread is created; both + # threads return -1 from dummy_thread.get_ident() and thus have the + # same key in the dict. So when the _MainThread instance created by + # 'threading' tries to clean itself up when atexit calls this method + # it gets a KeyError if another Thread instance was created. + # + # This all means that KeyError from trying to delete something from + # _active if dummy_threading is being used is a red herring. But + # since it isn't if dummy_threading is *not* being used then don't + # hide the exception. + + try: + with _active_limbo_lock: + del _active[_get_ident()] + # There must not be any python code between the previous line + # and after the lock is released. Otherwise a tracing function + # could try to acquire the lock again in the same thread, (in + # current_thread()), and would block. + except KeyError: + if 'dummy_threading' not in _sys.modules: + raise + + def join(self, timeout=None): + if not self.__initialized: + raise RuntimeError("Thread.__init__() not called") + if not self.__started.is_set(): + raise RuntimeError("cannot join thread before it is started") + if self is current_thread(): + raise RuntimeError("cannot join current thread") + + if __debug__: + if not self.__stopped: + self._note("%s.join(): waiting until thread stops", self) + self.__block.acquire() + try: + if timeout is None: + while not self.__stopped: + self.__block.wait() + if __debug__: + self._note("%s.join(): thread stopped", self) + else: + deadline = _time() + timeout + while not self.__stopped: + delay = deadline - _time() + if delay <= 0: + if __debug__: + self._note("%s.join(): timed out", self) + break + self.__block.wait(delay) + else: + if __debug__: + self._note("%s.join(): thread stopped", self) + finally: + self.__block.release() + + @property + def name(self): + assert self.__initialized, "Thread.__init__() not called" + return self.__name + + @name.setter + def name(self, name): + assert self.__initialized, "Thread.__init__() not called" + self.__name = str(name) + + @property + def ident(self): + assert self.__initialized, "Thread.__init__() not called" + return self.__ident + + def isAlive(self): + assert self.__initialized, "Thread.__init__() not called" + return self.__started.is_set() and not self.__stopped + + is_alive = isAlive + + @property + def daemon(self): + assert self.__initialized, "Thread.__init__() not called" + return self.__daemonic + + @daemon.setter + def daemon(self, daemonic): + if not self.__initialized: + raise RuntimeError("Thread.__init__() not called") + if self.__started.is_set(): + raise RuntimeError("cannot set daemon status of active thread"); + self.__daemonic = daemonic + + def isDaemon(self): + return self.daemon + + def setDaemon(self, daemonic): + self.daemon = daemonic + + def getName(self): + return self.name + + def setName(self, name): + self.name = name + +# The timer class was contributed by Itamar Shtull-Trauring + +def Timer(*args, **kwargs): + return _Timer(*args, **kwargs) + +class _Timer(Thread): + """Call a function after a specified number of seconds: + + t = Timer(30.0, f, args=[], kwargs={}) + t.start() + t.cancel() # stop the timer's action if it's still waiting + """ + + def __init__(self, interval, function, args=[], kwargs={}): + Thread.__init__(self) + self.interval = interval + self.function = function + self.args = args + self.kwargs = kwargs + self.finished = Event() + + def cancel(self): + """Stop the timer if it hasn't finished yet""" + self.finished.set() + + def run(self): + self.finished.wait(self.interval) + if not self.finished.is_set(): + self.function(*self.args, **self.kwargs) + self.finished.set() + +# Special thread class to represent the main thread +# This is garbage collected through an exit handler + +class _MainThread(Thread): + + def __init__(self): + Thread.__init__(self, name="MainThread") + self._Thread__started.set() + self._set_ident() + with _active_limbo_lock: + _active[_get_ident()] = self + + def _set_daemon(self): + return False + + def _exitfunc(self): + self._Thread__stop() + t = _pickSomeNonDaemonThread() + if t: + if __debug__: + self._note("%s: waiting for other threads", self) + while t: + t.join() + t = _pickSomeNonDaemonThread() + if __debug__: + self._note("%s: exiting", self) + self._Thread__delete() + +def _pickSomeNonDaemonThread(): + for t in enumerate(): + if not t.daemon and t.is_alive(): + return t + return None + + +# Dummy thread class to represent threads not started here. +# These aren't garbage collected when they die, nor can they be waited for. +# If they invoke anything in threading.py that calls current_thread(), they +# leave an entry in the _active dict forever after. +# Their purpose is to return *something* from current_thread(). +# They are marked as daemon threads so we won't wait for them +# when we exit (conform previous semantics). + +class _DummyThread(Thread): + + def __init__(self): + Thread.__init__(self, name=_newname("Dummy-%d")) + + # Thread.__block consumes an OS-level locking primitive, which + # can never be used by a _DummyThread. Since a _DummyThread + # instance is immortal, that's bad, so release this resource. + del self._Thread__block + + self._Thread__started.set() + self._set_ident() + with _active_limbo_lock: + _active[_get_ident()] = self + + def _set_daemon(self): + return True + + def join(self, timeout=None): + assert False, "cannot join a dummy thread" + + +# Global API functions + +def currentThread(): + try: + return _active[_get_ident()] + except KeyError: + ##print "current_thread(): no current thread for", _get_ident() + return _DummyThread() + +current_thread = currentThread + +def activeCount(): + with _active_limbo_lock: + return len(_active) + len(_limbo) + +active_count = activeCount + +def _enumerate(): + # Same as enumerate(), but without the lock. Internal use only. + return _active.values() + _limbo.values() + +def enumerate(): + with _active_limbo_lock: + return _active.values() + _limbo.values() + +# Create the main thread object, +# and make it available for the interpreter +# (Py_Main) as threading._shutdown. + +_shutdown = _MainThread()._exitfunc + +# get thread-local implementation, either from the thread +# module, or from the python fallback + +try: + from _pydev_thread import _local as local +except ImportError: + from _threading_local import local + + +def _after_fork(): + # This function is called by Python/ceval.c:PyEval_ReInitThreads which + # is called from PyOS_AfterFork. Here we cleanup threading module state + # that should not exist after a fork. + + # Reset _active_limbo_lock, in case we forked while the lock was held + # by another (non-forked) thread. http://bugs.python.org/issue874900 + global _active_limbo_lock + _active_limbo_lock = _allocate_lock() + + # fork() only copied the current thread; clear references to others. + new_active = {} + current = current_thread() + with _active_limbo_lock: + for thread in _active.itervalues(): + # Any lock/condition variable may be currently locked or in an + # invalid state, so we reinitialize them. + if hasattr(thread, '_reset_internal_locks'): + thread._reset_internal_locks() + if thread is current: + # There is only one active thread. We reset the ident to + # its new value since it can have changed. + ident = _get_ident() + thread._Thread__ident = ident + new_active[ident] = thread + else: + # All the others are already stopped. + thread._Thread__stop() + + _limbo.clear() + _active.clear() + _active.update(new_active) + assert len(_active) == 1 + + +# Self-test code + +def _test(): + + class BoundedQueue(_Verbose): + + def __init__(self, limit): + _Verbose.__init__(self) + self.mon = RLock() + self.rc = Condition(self.mon) + self.wc = Condition(self.mon) + self.limit = limit + self.queue = deque() + + def put(self, item): + self.mon.acquire() + while len(self.queue) >= self.limit: + self._note("put(%s): queue full", item) + self.wc.wait() + self.queue.append(item) + self._note("put(%s): appended, length now %d", + item, len(self.queue)) + self.rc.notify() + self.mon.release() + + def get(self): + self.mon.acquire() + while not self.queue: + self._note("get(): queue empty") + self.rc.wait() + item = self.queue.popleft() + self._note("get(): got %s, %d left", item, len(self.queue)) + self.wc.notify() + self.mon.release() + return item + + class ProducerThread(Thread): + + def __init__(self, queue, quota): + Thread.__init__(self, name="Producer") + self.queue = queue + self.quota = quota + + def run(self): + from random import random + counter = 0 + while counter < self.quota: + counter = counter + 1 + self.queue.put("%s.%d" % (self.name, counter)) + _sleep(random() * 0.00001) + + + class ConsumerThread(Thread): + + def __init__(self, queue, count): + Thread.__init__(self, name="Consumer") + self.queue = queue + self.count = count + + def run(self): + while self.count > 0: + item = self.queue.get() + print item + self.count = self.count - 1 + + NP = 3 + QL = 4 + NI = 5 + + Q = BoundedQueue(QL) + P = [] + for i in range(NP): + t = ProducerThread(Q, NI) + t.name = ("Producer-%d" % (i+1)) + P.append(t) + C = ConsumerThread(Q, NI*NP) + for t in P: + t.start() + _sleep(0.000001) + C.start() + for t in P: + t.join() + C.join() + +if __name__ == '__main__': + _test() diff --git a/python/helpers/pydev/_pydev_tipper_common.py b/python/helpers/pydev/_pydev_tipper_common.py index 8e6267fd27ea..f8c46d232b10 100644 --- a/python/helpers/pydev/_pydev_tipper_common.py +++ b/python/helpers/pydev/_pydev_tipper_common.py @@ -2,7 +2,7 @@ try: import inspect except: try: - from _pydev_imps import _pydev_inspect as inspect + import _pydev_inspect as inspect # for older versions except: import traceback;traceback.print_exc() #Ok, no inspect available (search will not work) @@ -10,58 +10,57 @@ try: import re except: try: - import sre as re # for older versions + import _pydev_re as re # for older versions @UnresolvedImport except: import traceback;traceback.print_exc() #Ok, no inspect available (search will not work) -from pydevd_constants import xrange def DoFind(f, mod): import linecache if inspect.ismodule(mod): return f, 0, 0 - + lines = linecache.getlines(f) - + if inspect.isclass(mod): name = mod.__name__ pat = re.compile(r'^\s*class\s*' + name + r'\b') - for i in xrange(len(lines)): - if pat.match(lines[i]): + for i in range(len(lines)): + if pat.match(lines[i]): return f, i, 0 - + return f, 0, 0 if inspect.ismethod(mod): mod = mod.im_func - + if inspect.isfunction(mod): try: mod = mod.func_code except AttributeError: mod = mod.__code__ #python 3k - + if inspect.istraceback(mod): mod = mod.tb_frame - + if inspect.isframe(mod): mod = mod.f_code if inspect.iscode(mod): if not hasattr(mod, 'co_filename'): return None, 0, 0 - + if not hasattr(mod, 'co_firstlineno'): return mod.co_filename, 0, 0 - + lnum = mod.co_firstlineno pat = re.compile(r'^(\s*def\s)|(.*(? 0: - if pat.match(lines[lnum]): + if pat.match(lines[lnum]): break lnum -= 1 - + return f, lnum, 0 raise RuntimeError('Do not know about: ' + f + ' ' + str(mod)) diff --git a/python/helpers/pydev/django_debug.py b/python/helpers/pydev/django_debug.py index 417ff0190e84..2b17864db47e 100644 --- a/python/helpers/pydev/django_debug.py +++ b/python/helpers/pydev/django_debug.py @@ -2,6 +2,7 @@ import inspect from django_frame import DjangoTemplateFrame from pydevd_comm import CMD_SET_BREAK from pydevd_constants import DJANGO_SUSPEND, GetThreadId, DictContains +from pydevd_file_utils import NormFileToServer from pydevd_breakpoints import LineBreakpoint import pydevd_vars import traceback diff --git a/python/helpers/pydev/fix_getpass.py b/python/helpers/pydev/fix_getpass.py index 160acc8d1be1..c81d93523238 100644 --- a/python/helpers/pydev/fix_getpass.py +++ b/python/helpers/pydev/fix_getpass.py @@ -1,13 +1,10 @@ def fixGetpass(): - try: - import getpass - except ImportError: - return #If we can't import it, we can't fix it - import warnings - fallback = getattr(getpass, 'fallback_getpass', None) # >= 2.6 - if not fallback: - fallback = getpass.default_getpass # <= 2.5 - getpass.getpass = fallback - if hasattr(getpass, 'GetPassWarning'): - warnings.simplefilter("ignore", category=getpass.GetPassWarning) + import getpass + import warnings + fallback = getattr(getpass, 'fallback_getpass', None) # >= 2.6 + if not fallback: + fallback = getpass.default_getpass # <= 2.5 + getpass.getpass = fallback + if hasattr(getpass, 'GetPassWarning'): + warnings.simplefilter("ignore", category=getpass.GetPassWarning) diff --git a/python/helpers/pydev/merge_pydev_pycharm.txt b/python/helpers/pydev/merge_pydev_pycharm.txt index e5e10f7421a1..e15eaab31c91 100644 --- a/python/helpers/pydev/merge_pydev_pycharm.txt +++ b/python/helpers/pydev/merge_pydev_pycharm.txt @@ -35,25 +35,6 @@ Done in the merge (started from the PyCharm version and bringing in things from - When the code is interrupted, the buffer in the python side is cleared. -- GEvent debugging: improved PyDev not to use the threading module (uses the thread - primitives directly), so, gevent debugging can work even if pydevd is used for - remote debugging. - - Also, the gevent debugging should probably be closer to the stackless debugging, - where we actually show the live stackless threads -- so, we should show the live - gevent greenlets -- which the current version doesn't do (future work). - -- Supporting Jython 2.2 onwards (note: CPython only tested with 2.7/3.3) - -- When there are big sets/tuples/lists/dicts, the items won't be all shown so that the - debugger speed doesn't suffer (the user should use the console if he wants to see - those items in this case). The limit was set to show up to 300 items (pydevd_resolver.MAX_ITEMS_TO_HANDLE) - -- Monkey-patching qt (QThread/QRunnable) to enable the debugger to work. - Notes: - - It must be imported before the user actually runs its code (as the definitions of QThread/QRunnable - are monkey-patched), so, for the remote debugger to work, pydevd must be imported at the start of - the program, even if pydevd.settrace will only be used later on. Things to be fixed in PyCharm: -------------------------------- @@ -129,14 +110,27 @@ Things to be fixed in PyCharm: Things to be fixed in PyDev: -------------------------------- -.Provide UI for 'smart step into' (later) +1. Provide UI for 'smart step into' -. Check what to do with 'message' from xml (later) +2. Check what to do with 'message' from xml. -. Deal with sendSignatureCallTrace (later) +3. Enable/test GEvent debugging (environment variable: GEVENT_SUPPORT). -. Set IPYTHONENABLE to False/True to use IPython console (later) +4. Deal with sendSignatureCallTrace. +5. Work with Django exceptions: CMD_ADD_DJANGO_EXCEPTION_BREAK/CMD_REMOVE_DJANGO_EXCEPTION_BREAK. + +6. Check console in debug frame. + +7. Set IPYTHONENABLE to False/True to use IPython console. + +TODO: +-------- +sendSignatureCallTrace: don't call if not needed + +Console integration (IPython and 'regular') (interrupt) + +Add back: CMD_EVALUATE_CONSOLE_EXPRESSION Manual test: --------------- diff --git a/python/helpers/pydev/pycompletion.py b/python/helpers/pydev/pycompletion.py index 33697806c102..e706d5410f3d 100644 --- a/python/helpers/pydev/pycompletion.py +++ b/python/helpers/pydev/pycompletion.py @@ -2,10 +2,12 @@ ''' @author Radim Kubacki ''' +import __builtin__ import _pydev_imports_tipper import traceback import StringIO import sys +import time import urllib import pycompletionserver @@ -22,7 +24,7 @@ def GetImports(module_name): except: s = StringIO.StringIO() exc_info = sys.exc_info() - + traceback.print_exception(exc_info[0], exc_info[1], exc_info[2], limit=None, file=s) err = s.getvalue() pycompletionserver.dbg('Received error: ' + str(err), pycompletionserver.ERROR) @@ -36,4 +38,4 @@ if __name__ == '__main__': mod_name = sys.argv[1] print(GetImports(mod_name)) - + diff --git a/python/helpers/pydev/pycompletionserver.py b/python/helpers/pydev/pycompletionserver.py index 59d08fa0c3c0..2fdd53903fb1 100644 --- a/python/helpers/pydev/pycompletionserver.py +++ b/python/helpers/pydev/pycompletionserver.py @@ -17,18 +17,31 @@ except NameError: setattr(__builtin__, 'True', 1) # Python 3.0 does not accept __builtin__.True = 1 in its syntax setattr(__builtin__, 'False', 0) -from pydevd_constants import IS_JYTHON +import pydevd_constants -if IS_JYTHON: +try: + from java.lang import Thread + IS_JYTHON = True SERVER_NAME = 'jycompletionserver' import _pydev_jy_imports_tipper # as _pydev_imports_tipper #changed to be backward compatible with 1.5 _pydev_imports_tipper = _pydev_jy_imports_tipper -else: +except ImportError: # it is python + IS_JYTHON = False SERVER_NAME = 'pycompletionserver' + if pydevd_constants.USE_LIB_COPY: + from _pydev_threading import Thread + else: + from threading import Thread import _pydev_imports_tipper + +if pydevd_constants.USE_LIB_COPY: + import _pydev_socket as socket +else: + import socket + import sys if sys.platform == "darwin": # See: https://sourceforge.net/projects/pydev/forums/forum/293649/topic/3454227 @@ -52,6 +65,11 @@ for name, mod in sys.modules.items(): import traceback +if pydevd_constants.USE_LIB_COPY: + import _pydev_time as time +else: + import time + try: import StringIO except: @@ -75,7 +93,7 @@ def dbg(s, prior): # f = open('c:/temp/test.txt', 'a') # print_ >> f, s # f.close() - + import pydev_localhost HOST = pydev_localhost.get_localhost() # Symbolic name meaning the local host @@ -173,21 +191,19 @@ class Processor: return '%s(%s)%s' % (MSG_COMPLETIONS, ''.join(compMsg), MSG_END) -class Exit(Exception): - pass -class CompletionServer: +class T(Thread): def __init__(self, port): + Thread.__init__(self) self.ended = False self.port = port self.socket = None # socket to send messages. - self.exit_process_on_kill = True self.processor = Processor() def connectToServer(self): - from _pydev_imps import _pydev_socket as socket + import socket self.socket = s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: @@ -256,7 +272,7 @@ class CompletionServer: while data.find(MSG_END) == -1: received = self.socket.recv(BUFFER_SIZE) if len(received) == 0: - raise Exit() # ok, connection ended + sys.exit(0) # ok, connection ended if IS_PYTHON3K: data = data + received.decode('utf-8') else: @@ -268,7 +284,7 @@ class CompletionServer: dbg(SERVER_NAME + ' kill message received', INFO1) # break if we received kill message. self.ended = True - raise Exit() + sys.exit(0) dbg(SERVER_NAME + ' starting keep alive thread', INFO2) @@ -349,7 +365,7 @@ class CompletionServer: else: self.send(MSG_INVALID_REQUEST) - except Exit: + except SystemExit: self.send(self.getCompletionsMessage(None, [('Exit:', 'SystemExit', '')])) raise @@ -368,12 +384,11 @@ class CompletionServer: self.socket.close() self.ended = True - raise Exit() # connection broken + sys.exit(0) # connection broken - except Exit: - if self.exit_process_on_kill: - sys.exit(0) + except SystemExit: + raise # No need to log SystemExit error except: s = StringIO.StringIO() @@ -390,6 +405,8 @@ if __name__ == '__main__': port = int(sys.argv[1]) # this is from where we want to receive messages. - t = CompletionServer(port) + t = T(port) dbg(SERVER_NAME + ' will start', INFO1) - t.run() + t.start() + time.sleep(5) + t.join() diff --git a/python/helpers/pydev/pydev_console_utils.py b/python/helpers/pydev/pydev_console_utils.py index 6e532183b0d1..b4c0e13b9201 100644 --- a/python/helpers/pydev/pydev_console_utils.py +++ b/python/helpers/pydev/pydev_console_utils.py @@ -1,11 +1,36 @@ -from pydev_imports import xmlrpclib, _queue, Exec +from pydev_imports import xmlrpclib import sys + +import traceback + +from pydevd_constants import USE_LIB_COPY from pydevd_constants import IS_JYTHON -from _pydev_imps import _pydev_thread as thread + +try: + if USE_LIB_COPY: + import _pydev_Queue as _queue + else: + import Queue as _queue +except: + import queue as _queue + +try: + from pydevd_exec import Exec +except: + from pydevd_exec2 import Exec + +try: + if USE_LIB_COPY: + import _pydev_thread as thread + else: + import thread +except: + import _thread as thread + import pydevd_xml import pydevd_vars -from pydevd_utils import * # @UnusedWildImport -import traceback + +from pydevd_utils import * #======================================================================================================================= # Null @@ -187,6 +212,8 @@ class BaseInterpreterInterface: self._input_error_printed = True sys.stderr.write('\nError when trying to update pydoc.help.input\n') sys.stderr.write('(help() may not work -- please report this as a bug in the pydev bugtracker).\n\n') + import traceback + traceback.print_exc() try: @@ -217,6 +244,8 @@ class BaseInterpreterInterface: except SystemExit: raise except: + import traceback; + traceback.print_exc() return more @@ -346,7 +375,7 @@ class BaseInterpreterInterface: self.interruptable = True def get_server(self): - if getattr(self, 'host', None) is not None: + if self.host is not None: return xmlrpclib.Server('http://%s:%s' % (self.host, self.client_port)) else: return None @@ -391,7 +420,7 @@ class BaseInterpreterInterface: # Important: it has to be really enabled in the main thread, so, schedule # it to run in the main thread. - self.exec_queue.put(do_change_variable) + self.exec_queue.put(do_connect_to_debugger) def _findFrame(self, thread_id, frame_id): ''' @@ -417,11 +446,15 @@ class BaseInterpreterInterface: try: # Try to import the packages needed to attach the debugger import pydevd - import _pydev_threading as threading + import pydevd_vars + if USE_LIB_COPY: + import _pydev_threading as threading + else: + import threading except: # This happens on Jython embedded in host eclipse - traceback.print_exc() + import traceback;traceback.print_exc() sys.stderr.write('pydevd is not available, cannot connect\n',) import pydev_localhost @@ -437,7 +470,7 @@ class BaseInterpreterInterface: import pydevd_tracing pydevd_tracing.SetTrace(None) except: - traceback.print_exc() + import traceback;traceback.print_exc() sys.stderr.write('Failed to connect to target debugger.\n') # Register to process commands when idle @@ -446,7 +479,7 @@ class BaseInterpreterInterface: import pydevconsole pydevconsole.set_debug_hook(self.debugger.processInternalCommands) except: - traceback.print_exc() + import traceback;traceback.print_exc() sys.stderr.write('Version of Python does not support debuggable Interactive Console.\n') # Important: it has to be really enabled in the main thread, so, schedule @@ -472,7 +505,7 @@ class BaseInterpreterInterface: enable_gui(guiname) except: sys.stderr.write("Failed to enable GUI event loop integration for '%s'\n" % guiname) - traceback.print_exc() + import traceback;traceback.print_exc() elif guiname not in ['none', '', None]: # Only print a warning if the guiname was going to do something sys.stderr.write("PyDev console: Python version does not support GUI event loop integration for '%s'\n" % guiname) diff --git a/python/helpers/pydev/pydev_imports.py b/python/helpers/pydev/pydev_imports.py index c5132cffbfe3..06858750c97d 100644 --- a/python/helpers/pydev/pydev_imports.py +++ b/python/helpers/pydev/pydev_imports.py @@ -1,61 +1,49 @@ -from pydevd_constants import USE_LIB_COPY, izip - - +from pydevd_constants import USE_LIB_COPY try: try: if USE_LIB_COPY: - from _pydev_imps import _pydev_xmlrpclib as xmlrpclib + import _pydev_xmlrpclib as xmlrpclib else: import xmlrpclib except ImportError: import xmlrpc.client as xmlrpclib except ImportError: - from _pydev_imps import _pydev_xmlrpclib as xmlrpclib - - + import _pydev_xmlrpclib as xmlrpclib try: try: if USE_LIB_COPY: - from _pydev_imps._pydev_SimpleXMLRPCServer import SimpleXMLRPCServer + from _pydev_SimpleXMLRPCServer import SimpleXMLRPCServer else: from SimpleXMLRPCServer import SimpleXMLRPCServer except ImportError: from xmlrpc.server import SimpleXMLRPCServer except ImportError: - from _pydev_imps._pydev_SimpleXMLRPCServer import SimpleXMLRPCServer - - - + from _pydev_SimpleXMLRPCServer import SimpleXMLRPCServer try: from StringIO import StringIO except ImportError: from io import StringIO - - try: execfile=execfile #Not in Py3k except NameError: - from _pydev_imps._pydev_execfile import execfile - - + from _pydev_execfile import execfile try: if USE_LIB_COPY: - from _pydev_imps import _pydev_Queue as _queue + import _pydev_Queue as _queue else: import Queue as _queue except: import queue as _queue #@UnresolvedImport - try: from pydevd_exec import Exec except: from pydevd_exec2 import Exec try: - from urllib import quote, quote_plus, unquote_plus + from urllib import quote except: - from urllib.parse import quote, quote_plus, unquote_plus #@UnresolvedImport + from urllib.parse import quote #@UnresolvedImport import os @@ -92,7 +80,7 @@ except: return start i = 0 - for start_seg, dest_seg in izip(orig_list, dest_list): + for start_seg, dest_seg in zip(orig_list, dest_list): if start_seg != os.path.normcase(dest_seg): break i += 1 diff --git a/python/helpers/pydev/pydev_ipython/inputhookglut.py b/python/helpers/pydev/pydev_ipython/inputhookglut.py index e1e67e9930ed..f0683ba5890e 100644 --- a/python/helpers/pydev/pydev_ipython/inputhookglut.py +++ b/python/helpers/pydev/pydev_ipython/inputhookglut.py @@ -29,8 +29,9 @@ GLUT Inputhook support functions #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- +import os import sys -from _pydev_imps import _pydev_time as time +import time import signal import OpenGL.GLUT as glut import OpenGL.platform as platform diff --git a/python/helpers/pydev/pydev_ipython/inputhookpyglet.py b/python/helpers/pydev/pydev_ipython/inputhookpyglet.py index 64dd2e559545..0cbb87f34b6d 100644 --- a/python/helpers/pydev/pydev_ipython/inputhookpyglet.py +++ b/python/helpers/pydev/pydev_ipython/inputhookpyglet.py @@ -20,8 +20,9 @@ Authors # Imports #----------------------------------------------------------------------------- +import os import sys -from _pydev_imps import _pydev_time as time +import time from timeit import default_timer as clock import pyglet from pydev_ipython.inputhook import stdin_ready diff --git a/python/helpers/pydev/pydev_ipython/inputhookqt4.py b/python/helpers/pydev/pydev_ipython/inputhookqt4.py index b7e1cf0527a8..27598fa742fe 100644 --- a/python/helpers/pydev/pydev_ipython/inputhookqt4.py +++ b/python/helpers/pydev/pydev_ipython/inputhookqt4.py @@ -19,7 +19,11 @@ Author: Christian Boos import os import signal -import threading +from pydevd_constants import USE_LIB_COPY +if USE_LIB_COPY: + import _pydev_threading as threading +else: + import threading from pydev_ipython.qt_for_kernel import QtCore, QtGui diff --git a/python/helpers/pydev/pydev_ipython/inputhookwx.py b/python/helpers/pydev/pydev_ipython/inputhookwx.py index 19ffdc72eff9..6640884663ad 100644 --- a/python/helpers/pydev/pydev_ipython/inputhookwx.py +++ b/python/helpers/pydev/pydev_ipython/inputhookwx.py @@ -19,7 +19,7 @@ Authors: Robin Dunn, Brian Granger, Ondrej Certik import sys import signal -from _pydev_imps import _pydev_time as time +import time from timeit import default_timer as clock import wx diff --git a/python/helpers/pydev/pydev_ipython_console.py b/python/helpers/pydev/pydev_ipython_console.py index 68c26747c6e0..7ba35211581a 100644 --- a/python/helpers/pydev/pydev_ipython_console.py +++ b/python/helpers/pydev/pydev_ipython_console.py @@ -1,5 +1,6 @@ import sys from pydev_console_utils import BaseInterpreterInterface +import re import os @@ -9,7 +10,7 @@ os.environ['TERM'] = 'emacs' #to use proper page_more() for paging # Uncomment to force PyDev standard shell. # raise ImportError() -from pydev_ipython_console_011 import get_pydev_frontend +from pydev_ipython_console_011 import PyDevFrontEnd #======================================================================================================================= # InterpreterInterface @@ -23,7 +24,7 @@ class InterpreterInterface(BaseInterpreterInterface): BaseInterpreterInterface.__init__(self, mainThread) self.client_port = client_port self.host = host - self.interpreter = get_pydev_frontend(host, client_port) + self.interpreter = PyDevFrontEnd(host, client_port) self._input_error_printed = False self.notification_succeeded = False self.notification_tries = 0 diff --git a/python/helpers/pydev/pydev_ipython_console_011.py b/python/helpers/pydev/pydev_ipython_console_011.py index 717aaccbc26e..54458e7c4af5 100644 --- a/python/helpers/pydev/pydev_ipython_console_011.py +++ b/python/helpers/pydev/pydev_ipython_console_011.py @@ -19,6 +19,7 @@ import os import codeop from IPython.core.error import UsageError +from IPython.core.inputsplitter import IPythonInputSplitter from IPython.core.completer import IPCompleter from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC from IPython.core.usage import default_banner_parts @@ -52,8 +53,7 @@ def show_in_pager(self, strng): print(strng) def create_editor_hook(pydev_host, pydev_client_port): - - def call_editor(filename, line=0, wait=True): + def call_editor(self, filename, line=0, wait=True): """ Open an editor in PyDev """ if line is None: line = 0 @@ -62,9 +62,6 @@ def create_editor_hook(pydev_host, pydev_client_port): # we don't launch a process. This is more like what happens in the zmqshell filename = os.path.abspath(filename) - # import sys - # sys.__stderr__.write('Calling editor at: %s:%s\n' % (pydev_host, pydev_client_port)) - # Tell PyDev to open the editor server = xmlrpclib.Server('http://%s:%s' % (pydev_host, pydev_client_port)) server.IPythonEditor(filename, str(line)) @@ -294,17 +291,22 @@ class PyDevTerminalInteractiveShell(TerminalInteractiveShell): InteractiveShellABC.register(PyDevTerminalInteractiveShell) # @UndefinedVariable #======================================================================================================================= -# _PyDevFrontEnd +# PyDevFrontEnd #======================================================================================================================= -class _PyDevFrontEnd: +class PyDevFrontEnd: version = release.__version__ - def __init__(self, *args, **kwarg): + def __init__(self, pydev_host, pydev_client_port, *args, **kwarg): # Create and initialize our IPython instance. self.ipython = PyDevTerminalInteractiveShell.instance() + # Back channel to PyDev to open editors (in the future other + # info may go back this way. This is the same channel that is + # used to get stdin, see StdIn in pydev_console_utils) + self.ipython.set_hook('editor', create_editor_hook(pydev_host, pydev_client_port)) + # Display the IPython banner, this has version info and # help info self.ipython.show_banner() @@ -410,9 +412,6 @@ class _PyDevFrontEnd: def getNamespace(self): return self.ipython.user_ns - - def clearBuffer(self): - del self._curr_exec_lines[:] def addExec(self, line): if self._curr_exec_lines: @@ -464,28 +463,3 @@ IPython.lib.inputhook.enable_gui = pydev_ipython.inputhook.enable_gui # rely on using the inputhooks directly. for name in pydev_ipython.inputhook.__all__: setattr(IPython.lib.inputhook, name, getattr(pydev_ipython.inputhook, name)) - - -class _PyDevFrontEndContainer: - _instance = None - _last_host_port = None - -def get_pydev_frontend(pydev_host, pydev_client_port): - if _PyDevFrontEndContainer._instance is None: - _PyDevFrontEndContainer._instance = _PyDevFrontEnd() - - if _PyDevFrontEndContainer._last_host_port != (pydev_host, pydev_client_port): - _PyDevFrontEndContainer._last_host_port = pydev_host, pydev_client_port - - # Back channel to PyDev to open editors (in the future other - # info may go back this way. This is the same channel that is - # used to get stdin, see StdIn in pydev_console_utils) - _PyDevFrontEndContainer._instance.ipython.hooks['editor'] = create_editor_hook(pydev_host, pydev_client_port) - - # Note: setting the callback directly because setting it with set_hook would actually create a chain instead - # of ovewriting at each new call). - # _PyDevFrontEndContainer._instance.ipython.set_hook('editor', create_editor_hook(pydev_host, pydev_client_port)) - - return _PyDevFrontEndContainer._instance - - \ No newline at end of file diff --git a/python/helpers/pydev/pydev_localhost.py b/python/helpers/pydev/pydev_localhost.py index a4b264ce94ad..4e7a4d95fc12 100644 --- a/python/helpers/pydev/pydev_localhost.py +++ b/python/helpers/pydev/pydev_localhost.py @@ -1,17 +1,21 @@ -from _pydev_imps import _pydev_socket as socket +import pydevd_constants +if pydevd_constants.USE_LIB_COPY: + import _pydev_socket as socket +else: + import socket _cache = None def get_localhost(): ''' Should return 127.0.0.1 in ipv4 and ::1 in ipv6 - + localhost is not used because on windows vista/windows 7, there can be issues where the resolving doesn't work - properly and takes a lot of time (had this issue on the pyunit server). - + properly and takes a lot of time (had this issue on the pyunit server). + Using the IP directly solves the problem. ''' #TODO: Needs better investigation! - + global _cache if _cache is None: try: diff --git a/python/helpers/pydev/pydev_monkey.py b/python/helpers/pydev/pydev_monkey.py index d92378ed0ee1..6e7d2e5b999c 100644 --- a/python/helpers/pydev/pydev_monkey.py +++ b/python/helpers/pydev/pydev_monkey.py @@ -5,8 +5,6 @@ import traceback pydev_src_dir = os.path.dirname(__file__) -from pydevd_constants import xrange - def is_python(path): if path.endswith("'") or path.endswith('"'): path = path[1:len(path)-1] @@ -104,7 +102,7 @@ def str_to_args_windows(args): buf = '' args_len = len(args) - for i in xrange(args_len): + for i in range(args_len): ch = args[i] if (ch == '\\'): backslashes+=1 @@ -387,118 +385,3 @@ def patch_new_process_functions_with_warning(): except ImportError: import _winapi as _subprocess monkey_patch_module(_subprocess, 'CreateProcess', create_CreateProcessWarnMultiproc) - - - -class _NewThreadStartupWithTrace: - - def __init__(self, original_func, args, kwargs): - self.original_func = original_func - self.args = args - self.kwargs = kwargs - - def __call__(self): - from pydevd_comm import GetGlobalDebugger - global_debugger = GetGlobalDebugger() - if global_debugger is not None: - global_debugger.SetTrace(global_debugger.trace_dispatch) - - return self.original_func(*self.args, **self.kwargs) - -class _NewThreadStartupWithoutTrace: - - def __init__(self, original_func, args, kwargs): - self.original_func = original_func - self.args = args - self.kwargs = kwargs - - def __call__(self): - return self.original_func(*self.args, **self.kwargs) - -_UseNewThreadStartup = _NewThreadStartupWithTrace - -def _get_threading_modules_to_patch(): - threading_modules_to_patch = [] - try: - import thread as _thread - threading_modules_to_patch.append(_thread) - except: - import _thread - threading_modules_to_patch.append(_thread) - return threading_modules_to_patch - -threading_modules_to_patch = _get_threading_modules_to_patch() - - - -def patch_thread_module(thread): - - if getattr(thread, '_original_start_new_thread', None) is None: - _original_start_new_thread = thread._original_start_new_thread = thread.start_new_thread - else: - _original_start_new_thread = thread._original_start_new_thread - - - class ClassWithPydevStartNewThread: - - def pydev_start_new_thread(self, function, args=(), kwargs={}): - ''' - We need to replace the original thread.start_new_thread with this function so that threads started - through it and not through the threading module are properly traced. - ''' - return _original_start_new_thread(_UseNewThreadStartup(function, args, kwargs), ()) - - # This is a hack for the situation where the thread.start_new_thread is declared inside a class, such as the one below - # class F(object): - # start_new_thread = thread.start_new_thread - # - # def start_it(self): - # self.start_new_thread(self.function, args, kwargs) - # So, if it's an already bound method, calling self.start_new_thread won't really receive a different 'self' -- it - # does work in the default case because in builtins self isn't passed either. - pydev_start_new_thread = ClassWithPydevStartNewThread().pydev_start_new_thread - - try: - # We need to replace the original thread.start_new_thread with this function so that threads started through - # it and not through the threading module are properly traced. - thread.start_new_thread = pydev_start_new_thread - thread.start_new = pydev_start_new_thread - except: - pass - -def patch_thread_modules(): - for t in threading_modules_to_patch: - patch_thread_module(t) - -def undo_patch_thread_modules(): - for t in threading_modules_to_patch: - try: - t.start_new_thread = t._original_start_new_thread - except: - pass - - try: - t.start_new = t._original_start_new_thread - except: - pass - -def disable_trace_thread_modules(): - ''' - Can be used to temporarily stop tracing threads created with thread.start_new_thread. - ''' - global _UseNewThreadStartup - _UseNewThreadStartup = _NewThreadStartupWithoutTrace - - -def enable_trace_thread_modules(): - ''' - Can be used to start tracing threads created with thread.start_new_thread again. - ''' - global _UseNewThreadStartup - _UseNewThreadStartup = _NewThreadStartupWithTrace - -def get_original_start_new_thread(threading_module): - try: - return threading_module._original_start_new_thread - except: - return threading_module.start_new_thread diff --git a/python/helpers/pydev/pydev_runfiles_parallel.py b/python/helpers/pydev/pydev_runfiles_parallel.py index 91f55283d5c5..e14f36d79139 100644 --- a/python/helpers/pydev/pydev_runfiles_parallel.py +++ b/python/helpers/pydev/pydev_runfiles_parallel.py @@ -1,5 +1,4 @@ import unittest -from _pydev_imps import _pydev_thread try: import Queue except: @@ -283,9 +282,13 @@ class ClientThread(threading.Thread): if False: proc = subprocess.Popen(args, env=os.environ, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - _pydev_thread.start_new_thread(self._reader_thread,(proc.stdout, sys.stdout)) + stdout_thread = threading.Thread(target=self._reader_thread,args=(proc.stdout, sys.stdout)) + stdout_thread.setDaemon(True) + stdout_thread.start() - _pydev_thread.start_new_thread(target=self._reader_thread,args=(proc.stderr, sys.stderr)) + stderr_thread = threading.Thread(target=self._reader_thread,args=(proc.stderr, sys.stderr)) + stderr_thread.setDaemon(True) + stderr_thread.start() else: proc = subprocess.Popen(args, env=os.environ, shell=False) proc.wait() diff --git a/python/helpers/pydev/pydev_runfiles_parallel_client.py b/python/helpers/pydev/pydev_runfiles_parallel_client.py index 7e5187ea8461..9a89cd54fd6e 100644 --- a/python/helpers/pydev/pydev_runfiles_parallel_client.py +++ b/python/helpers/pydev/pydev_runfiles_parallel_client.py @@ -1,7 +1,12 @@ from pydevd_constants import * #@UnusedWildImport -from pydev_imports import xmlrpclib, _queue -Queue = _queue.Queue +try: + from Queue import Queue +except: + from queue import Queue #@UnresolvedImport +import threading +from pydev_imports import xmlrpclib import traceback +import time from pydev_runfiles_coverage import StartCoverageSupportFromParams @@ -10,7 +15,7 @@ from pydev_runfiles_coverage import StartCoverageSupportFromParams # ParallelNotification #======================================================================================================================= class ParallelNotification(object): - + def __init__(self, method, args, kwargs): self.method = method self.args = args @@ -18,8 +23,8 @@ class ParallelNotification(object): def ToTuple(self): return self.method, self.args, self.kwargs - - + + #======================================================================================================================= # KillServer #======================================================================================================================= @@ -32,9 +37,9 @@ class KillServer(object): # ServerComm #======================================================================================================================= class ServerComm(threading.Thread): + - - + def __init__(self, job_id, server): self.notifications_queue = Queue() threading.Thread.__init__(self) @@ -42,11 +47,11 @@ class ServerComm(threading.Thread): assert job_id is not None assert port is not None self.job_id = job_id - + self.finished = False self.server = server - - + + def run(self): while True: kill_found = False @@ -57,7 +62,7 @@ class ServerComm(threading.Thread): else: assert isinstance(command, ParallelNotification) commands.append(command.ToTuple()) - + try: while True: command = self.notifications_queue.get(block=False) #No block to create a batch. @@ -80,7 +85,7 @@ class ServerComm(threading.Thread): self.server.lock.release() except: traceback.print_exc() - + if kill_found: self.finished = True return @@ -91,27 +96,27 @@ class ServerComm(threading.Thread): # ServerFacade #======================================================================================================================= class ServerFacade(object): - - + + def __init__(self, notifications_queue): self.notifications_queue = notifications_queue - - + + def notifyTestsCollected(self, *args, **kwargs): pass #This notification won't be passed - - + + def notifyTestRunFinished(self, *args, **kwargs): pass #This notification won't be passed - - + + def notifyStartTest(self, *args, **kwargs): self.notifications_queue.put_nowait(ParallelNotification('notifyStartTest', args, kwargs)) - - + + def notifyTest(self, *args, **kwargs): self.notifications_queue.put_nowait(ParallelNotification('notifyTest', args, kwargs)) - + #======================================================================================================================= @@ -119,25 +124,25 @@ class ServerFacade(object): #======================================================================================================================= def run_client(job_id, port, verbosity, coverage_output_file, coverage_include): job_id = int(job_id) - + import pydev_localhost server = xmlrpclib.Server('http://%s:%s' % (pydev_localhost.get_localhost(), port)) server.lock = threading.Lock() - + server_comm = ServerComm(job_id, server) server_comm.start() - + try: server_facade = ServerFacade(server_comm.notifications_queue) import pydev_runfiles import pydev_runfiles_xml_rpc pydev_runfiles_xml_rpc.SetServer(server_facade) - + #Starts None and when the 1st test is gotten, it's started (because a server may be initiated and terminated #before receiving any test -- which would mean a different process got all the tests to run). coverage = None - + try: tests_to_run = [1] while tests_to_run: @@ -148,34 +153,34 @@ def run_client(job_id, port, verbosity, coverage_output_file, coverage_include): tests_to_run = server.GetTestsToRun(job_id) finally: server.lock.release() - + if not tests_to_run: break - + if coverage is None: _coverage_files, coverage = StartCoverageSupportFromParams( None, coverage_output_file, 1, coverage_include) - + files_to_tests = {} for test in tests_to_run: filename_and_test = test.split('|') if len(filename_and_test) == 2: files_to_tests.setdefault(filename_and_test[0], []).append(filename_and_test[1]) - + configuration = pydev_runfiles.Configuration( - '', - verbosity, - None, - None, - None, - files_to_tests, + '', + verbosity, + None, + None, + None, + files_to_tests, 1, #Always single job here - None, - + None, + #The coverage is handled in this loop. - coverage_output_file=None, - coverage_include=None, + coverage_output_file=None, + coverage_include=None, ) test_runner = pydev_runfiles.PydevTestRunner(configuration) sys.stdout.flush() @@ -185,11 +190,11 @@ def run_client(job_id, port, verbosity, coverage_output_file, coverage_include): coverage.stop() coverage.save() - + except: traceback.print_exc() server_comm.notifications_queue.put_nowait(KillServer()) - + #======================================================================================================================= @@ -199,16 +204,16 @@ if __name__ == '__main__': if len(sys.argv) -1 == 3: job_id, port, verbosity = sys.argv[1:] coverage_output_file, coverage_include = None, None - + elif len(sys.argv) -1 == 5: job_id, port, verbosity, coverage_output_file, coverage_include = sys.argv[1:] - + else: raise AssertionError('Could not find out how to handle the parameters: '+sys.argv[1:]) - + job_id = int(job_id) port = int(port) verbosity = int(verbosity) run_client(job_id, port, verbosity, coverage_output_file, coverage_include) - - + + diff --git a/python/helpers/pydev/pydev_runfiles_pytest2.py b/python/helpers/pydev/pydev_runfiles_pytest2.py index e40d60f12e24..6a4d94f532b4 100644 --- a/python/helpers/pydev/pydev_runfiles_pytest2.py +++ b/python/helpers/pydev/pydev_runfiles_pytest2.py @@ -1,7 +1,4 @@ -import pickle -import zlib -import base64 -import os +import pickle, zlib, base64, os import py from py._code import code # @UnresolvedImport import pydev_runfiles_xml_rpc @@ -11,7 +8,6 @@ import sys import time - #=================================================================================================== # Load filters with tests we should skip #=================================================================================================== diff --git a/python/helpers/pydev/pydev_runfiles_xml_rpc.py b/python/helpers/pydev/pydev_runfiles_xml_rpc.py index 67bf4804b89b..35c69189c07c 100644 --- a/python/helpers/pydev/pydev_runfiles_xml_rpc.py +++ b/python/helpers/pydev/pydev_runfiles_xml_rpc.py @@ -1,12 +1,17 @@ - +import threading import traceback import warnings from _pydev_filesystem_encoding import getfilesystemencoding -from pydev_imports import xmlrpclib, _queue -Queue = _queue.Queue +from pydev_imports import xmlrpclib from pydevd_constants import * + +try: + from Queue import Queue +except: + from queue import Queue + #This may happen in IronPython (in Python it shouldn't happen as there are #'fast' replacements that are used in xmlrpclib.py) warnings.filterwarnings( diff --git a/python/helpers/pydev/pydevconsole.py b/python/helpers/pydev/pydevconsole.py index a5ece54b972b..565f9db45d1d 100644 --- a/python/helpers/pydev/pydevconsole.py +++ b/python/helpers/pydev/pydevconsole.py @@ -1,5 +1,3 @@ -from _pydev_imps._pydev_thread import start_new_thread - try: from code import InteractiveConsole except ImportError: @@ -11,7 +9,13 @@ from code import InteractiveInterpreter import os import sys -import _pydev_threading as threading +from pydevd_constants import USE_LIB_COPY +from pydevd_constants import IS_JYTHON + +if USE_LIB_COPY: + import _pydev_threading as threading +else: + import threading import traceback import fix_getpass @@ -19,7 +23,15 @@ fix_getpass.fixGetpass() import pydevd_vars -from pydev_imports import Exec, _queue +from pydev_imports import Exec + +try: + if USE_LIB_COPY: + import _pydev_Queue as _queue + else: + import Queue as _queue +except: + import queue as _queue try: import __builtin__ @@ -47,6 +59,17 @@ except: #That's OK, not all versions of python have sys.version_info pass +try: + try: + if USE_LIB_COPY: + import _pydev_xmlrpclib as xmlrpclib + else: + import xmlrpclib + except ImportError: + import xmlrpc.client as xmlrpclib +except ImportError: + import _pydev_xmlrpclib as xmlrpclib + class Command: def __init__(self, interpreter, code_fragment): @@ -58,14 +81,13 @@ class Command: self.code_fragment = code_fragment self.more = None - + @staticmethod def symbol_for_fragment(code_fragment): if code_fragment.is_single_line: symbol = 'single' else: symbol = 'exec' # Jython doesn't support this return symbol - symbol_for_fragment = staticmethod(symbol_for_fragment) def run(self): text = self.code_fragment.text @@ -290,6 +312,7 @@ def start_server(host, port, interpreter): sys.stderr.write(interpreter.get_greeting_msg()) sys.stderr.flush() + interpreter.server = server server.serve_forever() return server @@ -302,7 +325,11 @@ def StartServer(host, port, client_port): interpreter = InterpreterInterface(host, client_port, threading.currentThread()) - start_new_thread(start_server,(host, port, interpreter)) + server_thread = threading.Thread(target=start_server, + name='ServerThread', + args=(host, port, interpreter)) + server_thread.setDaemon(True) + server_thread.start() process_exec_queue(interpreter) diff --git a/python/helpers/pydev/pydevd.py b/python/helpers/pydev/pydevd.py index 2e5c484e4448..67a936ea1b46 100644 --- a/python/helpers/pydev/pydevd.py +++ b/python/helpers/pydev/pydevd.py @@ -1,12 +1,11 @@ #IMPORTANT: pydevd_constants must be the 1st thing defined because it'll keep a reference to the original sys._getframe from __future__ import nested_scopes # Jython 2.1 support - -import pydev_monkey_qt -pydev_monkey_qt.patch_qt() +from pydevd_constants import * # @UnusedWildImport import traceback from django_debug import DjangoLineBreakpoint +from pydevd_signature import SignatureFactory from pydevd_frame import add_exception_to_frame import pydev_imports from pydevd_breakpoints import * #@UnusedWildImport @@ -61,7 +60,8 @@ from pydevd_comm import CMD_CHANGE_VARIABLE, \ StartServer, \ InternalSetNextStatementThread, \ ReloadCodeCommand, \ - CMD_SET_PY_EXCEPTION, \ + ID_TO_MEANING,\ + CMD_SET_PY_EXCEPTION, \ CMD_IGNORE_THROWN_EXCEPTION_AT,\ InternalGetBreakpointException, \ InternalSendCurrExceptionTrace,\ @@ -69,9 +69,7 @@ from pydevd_comm import CMD_CHANGE_VARIABLE, \ CMD_ENABLE_DONT_TRACE, \ CMD_GET_FILE_CONTENTS,\ CMD_SET_PROPERTY_TRACE, CMD_RUN_CUSTOM_OPERATION,\ - InternalRunCustomOperation, CMD_EVALUATE_CONSOLE_EXPRESSION, InternalEvaluateConsoleExpression,\ - InternalConsoleGetCompletions - + InternalRunCustomOperation from pydevd_file_utils import NormFileToServer, GetFilenameAndBase import pydevd_file_utils import pydevd_vars @@ -83,12 +81,15 @@ from pydevd_custom_frames import CustomFramesContainer, CustomFramesContainerIni import pydevd_dont_trace import pydevd_traceproperty -from _pydev_imps import _pydev_time as time, _pydev_thread -import _pydev_threading as threading +if USE_LIB_COPY: + import _pydev_time as time + import _pydev_threading as threading +else: + import time + import threading import os -import atexit threadingEnumerate = threading.enumerate @@ -101,6 +102,7 @@ except: DONT_TRACE = { # commonly used things from the stdlib that we don't want to trace + 'threading.py':1, 'Queue.py':1, 'queue.py':1, 'socket.py':1, @@ -109,21 +111,12 @@ DONT_TRACE = { 'threading.py':1, #things from pydev that we don't want to trace - '_pydev_execfile.py':1, - '_pydev_jython_execfile.py':1, - '_pydev_threading':1, - '_pydev_Queue':1, - 'django_debug.py':1, - 'django_frame.py':1, - 'pydev_log.py':1, - 'pydev_monkey.py':1 , 'pydevd.py':1 , 'pydevd_additional_thread_info.py':1, + 'pydevd_custom_frames.py':1, 'pydevd_comm.py':1, 'pydevd_console.py':1 , 'pydevd_constants.py':1, - 'pydevd_custom_frames.py':1, - 'pydevd_dont_trace.py':1, 'pydevd_exec.py':1, 'pydevd_exec2.py':1, 'pydevd_file_utils.py':1, @@ -131,18 +124,18 @@ DONT_TRACE = { 'pydevd_import_class.py':1 , 'pydevd_io.py':1 , 'pydevd_psyco_stub.py':1, - 'pydevd_referrers.py':1 , 'pydevd_reload.py':1 , 'pydevd_resolver.py':1 , - 'pydevd_save_locals.py':1 , - 'pydevd_signature.py':1, 'pydevd_stackless.py':1 , 'pydevd_traceproperty.py':1, 'pydevd_tracing.py':1 , + 'pydevd_signature.py':1, 'pydevd_utils.py':1, 'pydevd_vars.py':1, 'pydevd_vm_type.py':1, - 'pydevd_xml.py':1, + '_pydev_execfile.py':1, + '_pydev_jython_execfile.py':1, + 'pydevd_dont_trace.py':1, } if IS_PY3K: @@ -162,28 +155,17 @@ remote = False from _pydev_filesystem_encoding import getfilesystemencoding file_system_encoding = getfilesystemencoding() - -# Hack for https://sw-brainwy.rhcloud.com/tracker/PyDev/363 (i.e.: calling isAlive() can throw AssertionError under some circumstances) -# It is required to debug threads started by start_new_thread in Python 3.4 -_temp = threading.Thread() -if hasattr(_temp, '_is_stopped'): # Python 3.4 has this - def isThreadAlive(t): - try: - return not t._is_stopped - except: - return t.isAlive() - -elif hasattr(_temp, '_Thread__stopped'): # Python 2.7 has this - def isThreadAlive(t): - try: - return not t._Thread__stopped - except: - return t.isAlive() - -else: # Haven't checked all other versions, so, let's use the regular isAlive call in this case. - def isThreadAlive(t): - return t.isAlive() -del _temp +def isThreadAlive(t): + try: + # If thread is not started yet we treat it as alive. + # It is required to debug threads started by start_new_thread in Python 3.4 + if hasattr(t, '_is_stopped'): + alive = not t._is_stopped + else: + alive = not t.__stopped + except: + alive = t.isAlive() + return alive #======================================================================================================================= # PyDBCommandThread @@ -197,7 +179,7 @@ class PyDBCommandThread(PyDBDaemonThread): self.setName('pydevd.CommandThread') def OnRun(self): - for i in xrange(1, 10): + for i in range(1, 10): time.sleep(0.5) #this one will only start later on (because otherwise we may not have any non-daemon threads if self.killReceived: return @@ -221,7 +203,7 @@ class PyDBCommandThread(PyDBDaemonThread): def killAllPydevThreads(): - threads = DictKeys(PyDBDaemonThread.created_pydb_daemon_threads) + threads = threadingEnumerate() for t in threads: if hasattr(t, 'doKillPydevThread'): t.doKillPydevThread() @@ -235,23 +217,12 @@ class PyDBCheckAliveThread(PyDBDaemonThread): def __init__(self, pyDb): PyDBDaemonThread.__init__(self) self.pyDb = pyDb + self.setDaemon(False) self.setName('pydevd.CheckAliveThread') def OnRun(self): if self.dontTraceMe: - - disable_tracing = True - - if pydevd_vm_type.GetVmType() == pydevd_vm_type.PydevdVmType.JYTHON and sys.hexversion <= 0x020201f0: - # don't run untraced threads if we're in jython 2.2.1 or lower - # jython bug: if we start a thread and another thread changes the tracing facility - # it affects other threads (it's not set only for the thread but globally) - # Bug: http://sourceforge.net/tracker/index.php?func=detail&aid=1870039&group_id=12867&atid=112867 - disable_tracing = False - - if disable_tracing: - pydevd_tracing.SetTrace(None) # no debugging on this thread - + self.pyDb.SetTrace(None) # no debugging on this thread while not self.killReceived: if not self.pyDb.haveAliveThreads(): try: @@ -269,6 +240,63 @@ class PyDBCheckAliveThread(PyDBDaemonThread): def doKillPydevThread(self): pass +if USE_LIB_COPY: + import _pydev_thread as thread +else: + try: + import thread + except ImportError: + import _thread as thread #Py3K changed it. + +_original_start_new_thread = thread.start_new_thread + +if getattr(thread, '_original_start_new_thread', None) is None: + thread._original_start_new_thread = thread.start_new_thread + +#======================================================================================================================= +# NewThreadStartup +#======================================================================================================================= +class NewThreadStartup: + + def __init__(self, original_func, args, kwargs): + self.original_func = original_func + self.args = args + self.kwargs = kwargs + + def __call__(self): + global_debugger = GetGlobalDebugger() + if global_debugger is not None: + global_debugger.SetTrace(global_debugger.trace_dispatch) + return self.original_func(*self.args, **self.kwargs) + +thread.NewThreadStartup = NewThreadStartup + +#======================================================================================================================= +# pydev_start_new_thread +#======================================================================================================================= +def _pydev_start_new_thread(function, args, kwargs={}): + ''' + We need to replace the original thread.start_new_thread with this function so that threads started through + it and not through the threading module are properly traced. + ''' + if USE_LIB_COPY: + import _pydev_thread as thread + else: + try: + import thread + except ImportError: + import _thread as thread #Py3K changed it. + + return thread._original_start_new_thread(thread.NewThreadStartup(function, args, kwargs), ()) + +class PydevStartNewThread(object): + def __get__(self, obj, type=None): + return self + + def __call__(self, function, args, kwargs={}): + return _pydev_start_new_thread(function, args, kwargs) + +pydev_start_new_thread = PydevStartNewThread() #======================================================================================================================= @@ -304,15 +332,12 @@ class PyDB: self.file_to_id_to_line_breakpoint = {} self.file_to_id_to_django_breakpoint = {} - # Note: breakpoints dict should not be mutated: a copy should be created - # and later it should be assigned back (to prevent concurrency issues). self.break_on_uncaught_exceptions = {} self.break_on_caught_exceptions = {} - self.django_exception_break = {} self.readyToRun = False - self._main_lock = _pydev_thread.allocate_lock() - self._lock_running_thread_ids = _pydev_thread.allocate_lock() + self._main_lock = threading.Lock() + self._lock_running_thread_ids = threading.Lock() self._py_db_command_thread_event = threading.Event() CustomFramesContainer._py_db_command_thread_event = self._py_db_command_thread_event self._finishDebuggingSession = False @@ -345,11 +370,7 @@ class PyDB: def haveAliveThreads(self): for t in threadingEnumerate(): - if isinstance(t, PyDBDaemonThread): - pydev_log.error_once( - 'Error in debugger: Found PyDBDaemonThread through threading.enumerate().\n') - - if isThreadAlive(t) and not t.isDaemon(): + if not isinstance(t, PyDBDaemonThread) and isThreadAlive(t) and not t.isDaemon(): return True return False @@ -404,9 +425,11 @@ class PyDB: if thread_id == "*": threads = threadingEnumerate() for t in threads: - thread_id = GetThreadId(t) - queue = self.getInternalQueue(thread_id) - queue.put(int_cmd) + thread_name = t.getName() + if not thread_name.startswith('pydevd.') or thread_name == 'pydevd.CommandThread': + thread_id = GetThreadId(t) + queue = self.getInternalQueue(thread_id) + queue.put(int_cmd) else: queue = self.getInternalQueue(thread_id) @@ -457,13 +480,7 @@ class PyDB: for t in all_threads: thread_id = GetThreadId(t) - if isinstance(t, PyDBDaemonThread): - pydev_log.error_once('Found PyDBDaemonThread in threading.enumerate.') - - elif getattr(t, 'is_pydev_daemon_thread', False): - pass # I.e.: skip the DummyThreads created from pydev daemon threads - - elif isThreadAlive(t): + if not isinstance(t, PyDBDaemonThread) and isThreadAlive(t): program_threads_alive[thread_id] = t if not DictContains(self._running_thread_ids, thread_id): @@ -526,18 +543,19 @@ class PyDB: threads = threadingEnumerate() try: for t in threads: - # TODO: optimize so that we only actually add that tracing if it's in - # the new breakpoint context. - additionalInfo = None - try: - additionalInfo = t.additionalInfo - except AttributeError: - pass # that's ok, no info currently set + if not t.getName().startswith('pydevd.'): + # TODO: optimize so that we only actually add that tracing if it's in + # the new breakpoint context. + additionalInfo = None + try: + additionalInfo = t.additionalInfo + except AttributeError: + pass # that's ok, no info currently set - if additionalInfo is not None: - for frame in additionalInfo.IterFrames(): - if frame is not ignore_frame: - self.SetTraceForFrameAndParents(frame, overwrite_prev_trace=overwrite_prev_trace) + if additionalInfo is not None: + for frame in additionalInfo.IterFrames(): + if frame is not ignore_frame: + self.SetTraceForFrameAndParents(frame, overwrite_prev_trace=overwrite_prev_trace) finally: frame = None t = None @@ -547,7 +565,7 @@ class PyDB: def consolidate_breakpoints(self, file, id_to_breakpoint, breakpoints): break_dict = {} - for breakpoint_id, pybreakpoint in DictIterItems(id_to_breakpoint): + for breakpoint_id, pybreakpoint in id_to_breakpoint.items(): break_dict[pybreakpoint.line] = pybreakpoint breakpoints[file] = break_dict @@ -568,18 +586,14 @@ class PyDB: ) if eb.notify_on_terminate: - cp = self.break_on_uncaught_exceptions.copy() - cp[exception] = eb + self.break_on_uncaught_exceptions[exception] = eb if DebugInfoHolder.DEBUG_TRACE_BREAKPOINTS > 0: - pydev_log.error("Exceptions to hook on terminate: %s\n" % (cp,)) - self.break_on_uncaught_exceptions = cp + pydev_log.error("Exceptions to hook on terminate: %s\n" % (self.break_on_uncaught_exceptions,)) if eb.notify_always: - cp = self.break_on_caught_exceptions.copy() - cp[exception] = eb + self.break_on_caught_exceptions[exception] = eb if DebugInfoHolder.DEBUG_TRACE_BREAKPOINTS > 0: - pydev_log.error("Exceptions to hook always: %s\n" % (cp,)) - self.break_on_caught_exceptions = cp + pydev_log.error("Exceptions to hook always: %s\n" % (self.break_on_caught_exceptions,)) return eb @@ -612,7 +626,7 @@ class PyDB: it may be worth refactoring it (actually, reordering the ifs so that the ones used mostly come before probably will give better performance). ''' - #print(ID_TO_MEANING[str(cmd_id)], repr(text)) + #print ID_TO_MEANING[str(cmd_id)], repr(text) self._main_lock.acquire() try: @@ -854,7 +868,7 @@ class PyDB: id_to_pybreakpoint[breakpoint_id] = breakpoint self.consolidate_breakpoints(file, id_to_pybreakpoint, breakpoints) - self.setTracingForUntracedContexts(overwrite_prev_trace=True) + self.setTracingForUntracedContexts() elif cmd_id == CMD_REMOVE_BREAK: #command to remove some breakpoint @@ -882,7 +896,7 @@ class PyDB: raise NameError(breakpoint_type) try: - id_to_pybreakpoint = file_to_id_to_breakpoint.get(file, {}) + id_to_pybreakpoint = file_to_id_to_breakpoint[file] if DebugInfoHolder.DEBUG_TRACE_BREAKPOINTS > 0: existing = id_to_pybreakpoint[breakpoint_id] sys.stderr.write('Removed breakpoint:%s - line:%s - func_name:%s (id: %s)\n' % ( @@ -920,8 +934,8 @@ class PyDB: # which allows setting caught/uncaught per exception. # splitted = text.split(';') - self.break_on_uncaught_exceptions = {} - self.break_on_caught_exceptions = {} + self.break_on_uncaught_exceptions.clear() + self.break_on_caught_exceptions.clear() added = [] if len(splitted) >= 4: if splitted[0] == 'true': @@ -1017,13 +1031,8 @@ class PyDB: elif cmd_id == CMD_REMOVE_EXCEPTION_BREAK: exception = text try: - cp = self.break_on_uncaught_exceptions.copy() - DictPop(cp, exception, None) - self.break_on_uncaught_exceptions = cp - - cp = self.break_on_caught_exceptions.copy() - DictPop(cp, exception, None) - self.break_on_caught_exceptions = cp + DictPop(self.break_on_uncaught_exceptions, exception, None) + DictPop(self.break_on_caught_exceptions, exception, None) except: pydev_log.debug("Error while removing exception %s"%sys.exc_info()[0]); update_exception_hook(self) @@ -1051,17 +1060,6 @@ class PyDB: except : pass - elif cmd_id == CMD_EVALUATE_CONSOLE_EXPRESSION: - # Command which takes care for the debug console communication - if text != "": - thread_id, frame_id, console_command = text.split('\t', 2) - console_command, line = console_command.split('\t') - if console_command == 'EVALUATE': - int_cmd = InternalEvaluateConsoleExpression(seq, thread_id, frame_id, line) - elif console_command == 'GET_COMPLETIONS': - int_cmd = InternalConsoleGetCompletions(seq, thread_id, frame_id, line) - self.postInternalCommand(int_cmd, thread_id) - elif cmd_id == CMD_RUN_CUSTOM_OPERATION: # Command which runs a custom operation if text != "": @@ -1218,7 +1216,7 @@ class PyDB: try: from_this_thread = [] - for frame_id, custom_frame in DictIterItems(CustomFramesContainer.custom_frames): + for frame_id, custom_frame in CustomFramesContainer.custom_frames.items(): if custom_frame.thread_id == thread.ident: # print >> sys.stderr, 'Frame created: ', frame_id self.writer.addCommand(self.cmdFactory.makeCustomFrameCreatedMessage(frame_id, custom_frame.name)) @@ -1339,7 +1337,7 @@ class PyDB: if self._finishDebuggingSession and not self._terminationEventSent: #that was not working very well because jython gave some socket errors try: - threads = DictKeys(PyDBDaemonThread.created_pydb_daemon_threads) + threads = threadingEnumerate() for t in threads: if hasattr(t, 'doKillPydevThread'): t.doKillPydevThread() @@ -1352,10 +1350,10 @@ class PyDB: is_file_to_ignore = DictContains(DONT_TRACE, base) #we don't want to debug threading or anything related to pydevd - #print('trace_dispatch', base, frame.f_lineno, event, frame.f_code.co_name, is_file_to_ignore) if is_file_to_ignore: return None + #print('trace_dispatch', base, frame.f_lineno, event, frame.f_code.co_name) try: #this shouldn't give an exception, but it could happen... (python bug) #see http://mail.python.org/pipermail/python-bugs-list/2007-June/038796.html @@ -1390,6 +1388,9 @@ class PyDB: self.processThreadNotAlive(GetThreadId(t)) return None # suspend tracing + if is_file_to_ignore: + return None + # each new frame... return additionalInfo.CreateDbFrame((self, filename, additionalInfo, t, frame)).trace_dispatch(frame, event, arg) @@ -1421,9 +1422,8 @@ class PyDB: - def SetTraceForFrameAndParents(self, frame, also_add_to_passed_frame=True, overwrite_prev_trace=False, dispatch_func=None): - if dispatch_func is None: - dispatch_func = self.trace_dispatch + def SetTraceForFrameAndParents(self, frame, also_add_to_passed_frame=True, overwrite_prev_trace=False): + dispatch_func = self.trace_dispatch if also_add_to_passed_frame: self.update_trace(frame, dispatch_func, overwrite_prev_trace) @@ -1460,14 +1460,13 @@ class PyDB: net = NetCommand(str(CMD_THREAD_CREATE), 0, '') self.writer.addCommand(net) - self.patch_threads() pydevd_tracing.SetTrace(self.trace_dispatch) + self.patch_threads() PyDBCommandThread(self).start() PyDBCheckAliveThread(self).start() - def patch_threads(self): try: # not available in jython! @@ -1475,8 +1474,11 @@ class PyDB: except: pass - from pydev_monkey import patch_thread_modules - patch_thread_modules() + try: + thread.start_new_thread = pydev_start_new_thread + thread.start_new = pydev_start_new_thread + except: + pass def run(self, file, globals=None, locals=None, set_trace=True): @@ -1564,47 +1566,43 @@ def processCommandLine(argv): setup['multiproc'] = False #Used by PyCharm (reuses connection: ssh tunneling) setup['multiprocess'] = False # Used by PyDev (creates new connection to ide) setup['save-signatures'] = False - setup['print-in-debugger-startup'] = False i = 0 del argv[0] while (i < len(argv)): - if argv[i] == '--port': + if (argv[i] == '--port'): del argv[i] setup['port'] = int(argv[i]) del argv[i] - elif argv[i] == '--vm_type': + elif (argv[i] == '--vm_type'): del argv[i] setup['vm_type'] = argv[i] del argv[i] - elif argv[i] == '--client': + elif (argv[i] == '--client'): del argv[i] setup['client'] = argv[i] del argv[i] - elif argv[i] == '--server': + elif (argv[i] == '--server'): del argv[i] setup['server'] = True - elif argv[i] == '--file': + elif (argv[i] == '--file'): del argv[i] setup['file'] = argv[i] i = len(argv) # pop out, file is our last argument - elif argv[i] == '--DEBUG_RECORD_SOCKET_READS': + elif (argv[i] == '--DEBUG_RECORD_SOCKET_READS'): del argv[i] setup['DEBUG_RECORD_SOCKET_READS'] = True - elif argv[i] == '--DEBUG': + elif (argv[i] == '--DEBUG'): del argv[i] set_debug(setup) - elif argv[i] == '--multiproc': + elif (argv[i] == '--multiproc'): del argv[i] setup['multiproc'] = True - elif argv[i] == '--multiprocess': + elif (argv[i] == '--multiprocess'): del argv[i] setup['multiprocess'] = True - elif argv[i] == '--save-signatures': + elif (argv[i] == '--save-signatures'): del argv[i] setup['save-signatures'] = True - elif argv[i] == '--print-in-debugger-startup': - del argv[i] - setup['print-in-debugger-startup'] = True else: raise ValueError("unexpected option " + argv[i]) return setup @@ -1615,6 +1613,18 @@ def usage(doExit=0): if doExit: sys.exit(0) +def SetTraceForParents(frame, dispatch_func): + frame = frame.f_back + while frame: + if frame.f_trace is None: + frame.f_trace = dispatch_func + + frame = frame.f_back + del frame + +def exit_hook(): + debugger = GetGlobalDebugger() + debugger.exiting() def initStdoutRedirect(): if not getattr(sys, 'stdoutBuf', None): @@ -1679,7 +1689,7 @@ def settrace( -_set_trace_lock = _pydev_thread.allocate_lock() +_set_trace_lock = threading.Lock() def _locked_settrace( host, @@ -1734,7 +1744,7 @@ def _locked_settrace( CustomFramesContainer.custom_frames_lock.acquire() try: - for _frameId, custom_frame in DictIterItems(CustomFramesContainer.custom_frames): + for _frameId, custom_frame in CustomFramesContainer.custom_frames.items(): debugger.SetTraceForFrameAndParents(custom_frame.frame, False) finally: CustomFramesContainer.custom_frames_lock.release() @@ -1761,9 +1771,7 @@ def _locked_settrace( # As this is the first connection, also set tracing for any untraced threads debugger.setTracingForUntracedContexts(ignore_frame=GetFrame(), overwrite_prev_trace=overwrite_prev_trace) - # Stop the tracing as the last thing before the actual shutdown for a clean exit. - atexit.register(stoptrace) - + sys.exitfunc = exit_hook #Suspend as the last thing after all tracing is in place. if suspend: debugger.setSuspend(t, CMD_SET_BREAK) @@ -1806,17 +1814,21 @@ def stoptrace(): except: pass - from pydev_monkey import undo_patch_thread_modules - undo_patch_thread_modules() - + try: + thread.start_new_thread = _original_start_new_thread + thread.start_new = _original_start_new_thread + except: + pass + debugger = GetGlobalDebugger() - + if debugger: - - debugger.SetTraceForFrameAndParents( - GetFrame(), also_add_to_passed_frame=True, overwrite_prev_trace=True, dispatch_func=lambda *args:None) + debugger.trace_dispatch = None + + debugger.SetTraceForFrameAndParents(GetFrame(), False) + debugger.exiting() - + killAllPydevThreads() connected = False @@ -1907,7 +1919,6 @@ class SetupHolder: # main #======================================================================================================================= if __name__ == '__main__': - # parse the command line. --file is our last argument that is required try: sys.original_argv = sys.argv[:] @@ -1917,12 +1928,6 @@ if __name__ == '__main__': traceback.print_exc() usage(1) - if setup['print-in-debugger-startup']: - try: - pid = ' (pid: %s)' % os.getpid() - except: - pid = '' - sys.stderr.write("pydev debugger: starting%s\n" % pid) fix_getpass.fixGetpass() @@ -2068,8 +2073,6 @@ if __name__ == '__main__': if pydevd_vm_type.GetVmType() == pydevd_vm_type.PydevdVmType.JYTHON: sys.stderr.write("Collecting run-time type information is not supported for Jython\n") else: - # Only import it if we're going to use it! - from pydevd_signature import SignatureFactory debugger.signature_factory = SignatureFactory() try: @@ -2082,4 +2085,3 @@ if __name__ == '__main__': connected = True # Mark that we're connected when started from inside ide. debugger.run(setup['file'], None, None) - diff --git a/python/helpers/pydev/pydevd_additional_thread_info.py b/python/helpers/pydev/pydevd_additional_thread_info.py index 76fb49ed1986..fa906adf385e 100644 --- a/python/helpers/pydev/pydevd_additional_thread_info.py +++ b/python/helpers/pydev/pydevd_additional_thread_info.py @@ -1,6 +1,9 @@ import sys from pydevd_constants import * #@UnusedWildImport -from _pydev_imps import _pydev_thread +if USE_LIB_COPY: + import _pydev_threading as threading +else: + import threading from pydevd_frame import PyDBFrame import weakref @@ -59,7 +62,7 @@ class PyDBAdditionalThreadInfoWithoutCurrentFramesSupport(AbstractPyDBAdditional #Or if the user compiled threadframe (from http://www.majid.info/mylos/stories/2004/06/10/threadframe.html) #NOT RLock!! (could deadlock if it was) - self.lock = _pydev_thread.allocate_lock() + self.lock = threading.Lock() self._acquire_lock = self.lock.acquire self._release_lock = self.lock.release diff --git a/python/helpers/pydev/pydevd_breakpoints.py b/python/helpers/pydev/pydevd_breakpoints.py index 1171157257e9..8c65436bac21 100644 --- a/python/helpers/pydev/pydevd_breakpoints.py +++ b/python/helpers/pydev/pydevd_breakpoints.py @@ -8,7 +8,10 @@ _original_excepthook = None _handle_exceptions = None -import _pydev_threading as threading +if USE_LIB_COPY: + import _pydev_threading as threading +else: + import threading threadingCurrentThread = threading.currentThread @@ -142,7 +145,7 @@ def _restore_pm_excepthook(): def update_exception_hook(dbg): if dbg.break_on_uncaught_exceptions: - _set_pm_excepthook(dbg.break_on_uncaught_exceptions) + _set_pm_excepthook(dbg.break_on_uncaught_exceptions.copy()) else: _restore_pm_excepthook() diff --git a/python/helpers/pydev/pydevd_comm.py b/python/helpers/pydev/pydevd_comm.py index d38d35541aa1..8d37d0d35ba5 100644 --- a/python/helpers/pydev/pydevd_comm.py +++ b/python/helpers/pydev/pydevd_comm.py @@ -61,10 +61,32 @@ from pydevd_constants import * #@UnusedWildImport import sys -from _pydev_imps import _pydev_time as time, _pydev_thread -import _pydev_threading as threading -from _pydev_imps._pydev_socket import socket, AF_INET, SOCK_STREAM, SHUT_RD, SHUT_WR -from pydev_imports import _queue +if USE_LIB_COPY: + import _pydev_time as time + import _pydev_threading as threading + try: + import _pydev_thread as thread + except ImportError: + import _thread as thread #Py3K changed it. + import _pydev_Queue as _queue + from _pydev_socket import socket + from _pydev_socket import AF_INET, SOCK_STREAM + from _pydev_socket import SHUT_RD, SHUT_WR +else: + import time + import threading + try: + import thread + except ImportError: + import _thread as thread #Py3K changed it. + + try: + import Queue as _queue + except ImportError: + import queue as _queue + from socket import socket + from socket import AF_INET, SOCK_STREAM + from socket import SHUT_RD, SHUT_WR try: from urllib import quote, quote_plus, unquote, unquote_plus @@ -81,8 +103,6 @@ import pydev_log import _pydev_completer from pydevd_tracing import GetExceptionTracebackStr -import pydevd_console -from pydev_monkey import disable_trace_thread_modules, enable_trace_thread_modules @@ -242,42 +262,22 @@ def SetGlobalDebugger(dbg): #======================================================================================================================= # PyDBDaemonThread #======================================================================================================================= -class PyDBDaemonThread: - - created_pydb_daemon_threads = {} +class PyDBDaemonThread(threading.Thread): def __init__(self): - # Note: subclasses are always daemon threads. + threading.Thread.__init__(self) + self.setDaemon(True) self.killReceived = False self.dontTraceMe = True - def setName(self, name): - self.name = name - - def start(self): - import pydev_monkey - start_new_thread = pydev_monkey.get_original_start_new_thread(_pydev_thread) - start_new_thread(self.run, ()) - def run(self): - created_pydb_daemon = self.created_pydb_daemon_threads - created_pydb_daemon[self] = 1 - dummy_thread = threading.currentThread() - dummy_thread.is_pydev_daemon_thread = True - try: - try: - if IS_JYTHON: - import org.python.core as PyCore #@UnresolvedImport - ss = PyCore.PySystemState() - # Note: Py.setSystemState() affects only the current thread. - PyCore.Py.setSystemState(ss) - - self.OnRun() - except: - if sys is not None and traceback is not None: - traceback.print_exc() - finally: - del created_pydb_daemon[self] + if sys.platform.startswith("java"): + import org.python.core as PyCore #@UnresolvedImport + ss = PyCore.PySystemState() + # Note: Py.setSystemState() affects only the current thread. + PyCore.Py.setSystemState(ss) + + self.OnRun() def OnRun(self): raise NotImplementedError('Should be reimplemented by: %s' % self.__class__) @@ -288,18 +288,7 @@ class PyDBDaemonThread: def stopTrace(self): if self.dontTraceMe: - - disable_tracing = True - - if pydevd_vm_type.GetVmType() == pydevd_vm_type.PydevdVmType.JYTHON and sys.hexversion <= 0x020201f0: - # don't run untraced threads if we're in jython 2.2.1 or lower - # jython bug: if we start a thread and another thread changes the tracing facility - # it affects other threads (it's not set only for the thread but globally) - # Bug: http://sourceforge.net/tracker/index.php?func=detail&aid=1870039&group_id=12867&atid=112867 - disable_tracing = False - - if disable_tracing: - pydevd_tracing.SetTrace(None) # no debugging on this thread + pydevd_tracing.SetTrace(None) # no debugging on this thread #======================================================================================================================= @@ -382,6 +371,7 @@ class WriterThread(PyDBDaemonThread): """ writer thread writes out the commands in an infinite loop """ def __init__(self, sock): PyDBDaemonThread.__init__(self) + self.setDaemon(False) #writer isn't daemon to be able to deliver all messages after main thread terminated self.sock = sock self.setName("pydevd.Writer") self.cmdQueue = _queue.Queue() @@ -399,16 +389,11 @@ class WriterThread(PyDBDaemonThread): """ just loop and write responses """ self.stopTrace() - get_has_timeout = sys.hexversion >= 0x02030000 # 2.3 onwards have it. try: while True: try: try: - if get_has_timeout: - cmd = self.cmdQueue.get(1, 0.1) - else: - time.sleep(.01) - cmd = self.cmdQueue.get(0) + cmd = self.cmdQueue.get(1, 0.1) except _queue.Empty: if self.killReceived: try: @@ -805,7 +790,7 @@ class ReloadCodeCommand(InternalThreadCommand): self.thread_id = thread_id self.module_name = module_name self.executed = False - self.lock = _pydev_thread.allocate_lock() + self.lock = threading.Lock() def canBeExecutedBy(self, thread_id): @@ -1023,7 +1008,7 @@ class InternalEvaluateExpression(InternalThreadCommand): try: result = pydevd_vars.evaluateExpression(self.thread_id, self.frame_id, self.expression, self.doExec) xml = "" - xml += pydevd_vars.varToXML(result, self.expression, self.doTrim) + xml += pydevd_vars.varToXML(result, "", self.doTrim) xml += "" cmd = dbg.cmdFactory.makeEvaluateExpressionMessage(self.sequence, xml) dbg.writer.addCommand(cmd) @@ -1183,12 +1168,7 @@ class InternalEvaluateConsoleExpression(InternalThreadCommand): console_message = pydevd_console.execute_console_command(frame, self.thread_id, self.frame_id, self.line) cmd = dbg.cmdFactory.makeSendConsoleMessage(self.sequence, console_message.toXML()) else: - from pydevd_console import ConsoleMessage - console_message = ConsoleMessage() - console_message.add_console_message( - pydevd_console.CONSOLE_ERROR, - "Select the valid frame in the debug view (thread: %s, frame: %s invalid)" % (self.thread_id, self.frame_id), - ) + console_message.add_console_message(pydevd_console.CONSOLE_ERROR, "Select the valid frame in the debug view") cmd = dbg.cmdFactory.makeErrorMessage(self.sequence, console_message.toXML()) except: exc = GetExceptionTracebackStr() @@ -1265,10 +1245,13 @@ class InternalConsoleExec(InternalThreadCommand): def doIt(self, dbg): """ Converts request into python variable """ + pydev_start_new_thread = None try: try: - #don't trace new threads created by console command - disable_trace_thread_modules() + pydev_start_new_thread = thread.start_new_thread + + thread.start_new_thread = thread._original_start_new_thread #don't trace new threads created by console command + thread.start_new = thread._original_start_new_thread result = pydevconsole.consoleExec(self.thread_id, self.frame_id, self.expression) xml = "" @@ -1282,8 +1265,8 @@ class InternalConsoleExec(InternalThreadCommand): cmd = dbg.cmdFactory.makeErrorMessage(self.sequence, "Error evaluating console expression " + exc) dbg.writer.addCommand(cmd) finally: - enable_trace_thread_modules() - + thread.start_new_thread = pydev_start_new_thread + thread.start_new = pydev_start_new_thread sys.stderr.flush() sys.stdout.flush() diff --git a/python/helpers/pydev/pydevd_console.py b/python/helpers/pydev/pydevd_console.py index 52b18bb29211..0751d7755f4d 100644 --- a/python/helpers/pydev/pydevd_console.py +++ b/python/helpers/pydev/pydevd_console.py @@ -27,9 +27,9 @@ class ConsoleMessage: self.more = False # List of tuple [('error', 'error_message'), ('message_list', 'output_message')] self.console_messages = [] - + def add_console_message(self, message_type, message): - """add messages in the console_messages list + """add messages in the console_messages list """ for m in message.split("\n"): if m.strip(): @@ -50,14 +50,14 @@ class ConsoleMessage: """ makeValid = makeValidXmlValue - + xml = '%s' % (self.more) for message_type, message in self.console_messages: xml += '<%s message="%s">' % (message_type, makeValid(message), message_type) xml += '' - + return xml @@ -65,7 +65,7 @@ class ConsoleMessage: # DebugConsoleStdIn #======================================================================================================================= class DebugConsoleStdIn(BaseStdIn): - + overrides(BaseStdIn.readline) def readline(self, *args, **kwargs): sys.stderr.write('Warning: Reading from stdin is still not supported in this console.\n') @@ -75,10 +75,10 @@ class DebugConsoleStdIn(BaseStdIn): # DebugConsole #======================================================================================================================= class DebugConsole(InteractiveConsole, BaseInterpreterInterface): - """Wrapper around code.InteractiveConsole, in order to send + """Wrapper around code.InteractiveConsole, in order to send errors and outputs to the debug console """ - + overrides(BaseInterpreterInterface.createStdIn) def createStdIn(self): return DebugConsoleStdIn() #For now, raw_input is not supported in this console. @@ -86,12 +86,12 @@ class DebugConsole(InteractiveConsole, BaseInterpreterInterface): overrides(InteractiveConsole.push) def push(self, line, frame): - """Change built-in stdout and stderr methods by the + """Change built-in stdout and stderr methods by the new custom StdMessage. execute the InteractiveConsole.push. Change the stdout and stderr back be the original built-ins - - Return boolean (True if more input is required else False), + + Return boolean (True if more input is required else False), output_messages and input_messages """ more = False @@ -102,7 +102,7 @@ class DebugConsole(InteractiveConsole, BaseInterpreterInterface): self.frame = frame out = sys.stdout = IOBuf() err = sys.stderr = IOBuf() - more = self.addExec(line) + more, _need_input = self.addExec(line) except Exception: exc = GetExceptionTracebackStr() err.buflist.append("Internal Error: %s" % (exc,)) @@ -111,15 +111,15 @@ class DebugConsole(InteractiveConsole, BaseInterpreterInterface): self.frame = None frame = None sys.stdout = original_stdout - sys.stderr = original_stderr + sys.stderr = original_stderr return more, out.buflist, err.buflist - - + + overrides(BaseInterpreterInterface.doAddExec) def doAddExec(self, line): return InteractiveConsole.push(self, line) - + overrides(InteractiveConsole.runcode) def runcode(self, code): @@ -147,24 +147,24 @@ class DebugConsole(InteractiveConsole, BaseInterpreterInterface): # InteractiveConsoleCache #======================================================================================================================= class InteractiveConsoleCache: - + thread_id = None frame_id = None interactive_console_instance = None - + #Note: On Jython 2.1 we can't use classmethod or staticmethod, so, just make the functions below free-functions. def get_interactive_console(thread_id, frame_id, frame, console_message): """returns the global interactive console. - interactive console should have been initialized by this time + interactive console should have been initialized by this time """ if InteractiveConsoleCache.thread_id == thread_id and InteractiveConsoleCache.frame_id == frame_id: return InteractiveConsoleCache.interactive_console_instance - + InteractiveConsoleCache.interactive_console_instance = DebugConsole() - InteractiveConsoleCache.thread_id = thread_id + InteractiveConsoleCache.thread_id = thread_id InteractiveConsoleCache.frame_id = frame_id - + console_stacktrace = traceback.extract_stack(frame, limit=1) if console_stacktrace: current_context = console_stacktrace[0] # top entry from stacktrace @@ -177,23 +177,23 @@ def clear_interactive_console(): InteractiveConsoleCache.thread_id = None InteractiveConsoleCache.frame_id = None InteractiveConsoleCache.interactive_console_instance = None - + def execute_console_command(frame, thread_id, frame_id, line): - """fetch an interactive console instance from the cache and + """fetch an interactive console instance from the cache and push the received command to the console. - - create and return an instance of console_message + + create and return an instance of console_message """ console_message = ConsoleMessage() - + interpreter = get_interactive_console(thread_id, frame_id, frame, console_message) more, output_messages, error_messages = interpreter.push(line, frame) console_message.update_more(more) - + for message in output_messages: console_message.add_console_message(CONSOLE_OUTPUT, message) - + for message in error_messages: console_message.add_console_message(CONSOLE_ERROR, message) diff --git a/python/helpers/pydev/pydevd_constants.py b/python/helpers/pydev/pydevd_constants.py index 39907a99c6ea..d6500e14cd44 100644 --- a/python/helpers/pydev/pydevd_constants.py +++ b/python/helpers/pydev/pydevd_constants.py @@ -1,6 +1,7 @@ ''' This module holds the constants used for specifying the states of the debugger. ''' + STATE_RUN = 1 STATE_SUSPEND = 2 @@ -73,8 +74,12 @@ SUPPORT_GEVENT = os.getenv('GEVENT_SUPPORT', 'False') == 'True' USE_LIB_COPY = SUPPORT_GEVENT and not IS_PY3K and sys.version_info[1] >= 6 -from _pydev_imps import _pydev_thread -_nextThreadIdLock = _pydev_thread.allocate_lock() +if USE_LIB_COPY: + import _pydev_threading as threading +else: + import threading + +_nextThreadIdLock = threading.Lock() #======================================================================================================================= # Jython? @@ -114,40 +119,20 @@ if IS_PY3K: return list(d.values()) DictIterValues = dict.values - - def DictIterItems(d): - return d.items() - - def DictItems(d): - return list(d.items()) - else: DictKeys = dict.keys try: DictIterValues = dict.itervalues except: DictIterValues = dict.values #Older versions don't have the itervalues - DictValues = dict.values - def DictIterItems(d): - return d.iteritems() - - def DictItems(d): - return d.items() - try: - xrange = xrange + xrange except: #Python 3k does not have it xrange = range - -try: - import itertools - izip = itertools.izip -except: - izip = zip try: object diff --git a/python/helpers/pydev/pydevd_custom_frames.py b/python/helpers/pydev/pydevd_custom_frames.py index 8709e6a17dd6..e259356b8336 100644 --- a/python/helpers/pydev/pydevd_custom_frames.py +++ b/python/helpers/pydev/pydevd_custom_frames.py @@ -1,6 +1,5 @@ from pydevd_constants import * #@UnusedWildImport from pydevd_file_utils import GetFilenameAndBase -from _pydev_imps import _pydev_thread threadingCurrentThread = threading.currentThread DEBUG = False @@ -14,7 +13,7 @@ class CustomFramesContainer: def CustomFramesContainerInit(): #Note: no staticmethod on jython 2.1 (so, use free-function) - CustomFramesContainer.custom_frames_lock = _pydev_thread.allocate_lock() + CustomFramesContainer.custom_frames_lock = threading.Lock() # custom_frames can only be accessed if properly locked with custom_frames_lock! # Key is a string identifying the frame (as well as the thread it belongs to). diff --git a/python/helpers/pydev/pydevd_file_utils.py b/python/helpers/pydev/pydevd_file_utils.py index c135c4bd5ad4..147aa66b946d 100644 --- a/python/helpers/pydev/pydevd_file_utils.py +++ b/python/helpers/pydev/pydevd_file_utils.py @@ -38,6 +38,10 @@ machine for the paths that'll actually have breakpoints). ''' + + + +from pydevd_constants import * #@UnusedWildImport import os.path import sys import traceback diff --git a/python/helpers/pydev/pydevd_frame.py b/python/helpers/pydev/pydevd_frame.py index 5d1e78458391..b7073678bf66 100644 --- a/python/helpers/pydev/pydevd_frame.py +++ b/python/helpers/pydev/pydevd_frame.py @@ -15,11 +15,7 @@ from pydevd_comm import CMD_ADD_DJANGO_EXCEPTION_BREAK, \ CMD_STEP_INTO, CMD_SMART_STEP_INTO, CMD_RUN_TO_LINE, CMD_SET_NEXT_STATEMENT from pydevd_constants import * # @UnusedWildImport from pydevd_file_utils import GetFilenameAndBase -try: - from pydevd_signature import sendSignatureCallTrace -except ImportError: - def sendSignatureCallTrace(*args, **kwargs): - pass +from pydevd_signature import sendSignatureCallTrace import pydevd_vars import pydevd_dont_trace @@ -85,7 +81,7 @@ class PyDBFrame: if trace is not None: #on jython trace is None on the first event exception_breakpoint = get_exception_breakpoint( - exception, mainDebugger.break_on_caught_exceptions) + exception, mainDebugger.break_on_caught_exceptions.copy()) if exception_breakpoint is not None: if not exception_breakpoint.notify_on_first_raise_only or just_raised(trace): @@ -207,7 +203,6 @@ class PyDBFrame: try: frame_id_to_frame = {} - frame_id_to_frame[id(frame)] = frame f = trace_obj.tb_frame while f is not None: frame_id_to_frame[id(f)] = f @@ -249,7 +244,7 @@ class PyDBFrame: if getattr(thread, 'pydev_do_not_trace', None): return None - if event == 'call' and main_debugger.signature_factory: + if event == 'call': sendSignatureCallTrace(main_debugger, frame, filename) is_exception_event = event == 'exception' diff --git a/python/helpers/pydev/pydevd_resolver.py b/python/helpers/pydev/pydevd_resolver.py index ad49bd881ba0..614549f74f37 100644 --- a/python/helpers/pydev/pydevd_resolver.py +++ b/python/helpers/pydev/pydevd_resolver.py @@ -13,13 +13,9 @@ except: setattr(__builtin__, 'False', 0) import pydevd_constants -from pydevd_constants import DictIterItems, xrange -# Note: 300 is already a lot to see in the outline (after that the user should really use the shell to get things) -# and this also means we'll pass less information to the client side (which makes debugging faster). -MAX_ITEMS_TO_HANDLE = 300 - +MAX_ITEMS_TO_HANDLE = 500 TOO_LARGE_MSG = 'Too large to show contents. Max items to show: ' + str(MAX_ITEMS_TO_HANDLE) TOO_LARGE_ATTR = 'Unable to handle:' @@ -62,7 +58,7 @@ except: class AbstractResolver: ''' This class exists only for documentation purposes to explain how to create a resolver. - + Some examples on how to resolve things: - list: getDictionary could return a dict with index->item and use the index to resolve it later - set: getDictionary could return a dict with id(object)->object and reiterate in that array to resolve it later @@ -73,7 +69,7 @@ class AbstractResolver: ''' In this method, we'll resolve some child item given the string representation of the item in the key representing the previously asked dictionary. - + @param var: this is the actual variable to be resolved. @param attribute: this is the string representation of a key previously returned in getDictionary. ''' @@ -82,7 +78,7 @@ class AbstractResolver: def getDictionary(self, var): ''' @param var: this is the variable that should have its children gotten. - + @return: a dictionary where each pair key, value should be shown to the user as children items in the variables view for the given var. ''' @@ -132,12 +128,12 @@ class DefaultResolver: declaredMethods = obj.getDeclaredMethods() declaredFields = obj.getDeclaredFields() - for i in xrange(len(declaredMethods)): + for i in range(len(declaredMethods)): name = declaredMethods[i].getName() ret[name] = declaredMethods[i].toString() found.put(name, 1) - for i in xrange(len(declaredFields)): + for i in range(len(declaredFields)): name = declaredFields[i].getName() found.put(name, 1) #if declaredFields[i].isAccessible(): @@ -149,7 +145,7 @@ class DefaultResolver: ret[name] = declaredFields[i].toString() #this simple dir does not always get all the info, that's why we have the part before - #(e.g.: if we do a dir on String, some methods that are from other interfaces such as + #(e.g.: if we do a dir on String, some methods that are from other interfaces such as #charAt don't appear) try: d = dir(original) @@ -173,8 +169,8 @@ class DefaultResolver: names = var.__members__ d = {} - #Be aware that the order in which the filters are applied attempts to - #optimize the operation by removing as many items as possible in the + #Be aware that the order in which the filters are applied attempts to + #optimize the operation by removing as many items as possible in the #first filters, leaving fewer items for later filters if filterBuiltIn or filterFunction: @@ -216,18 +212,18 @@ class DefaultResolver: class DictResolver: def resolve(self, dict, key): - if key in ('__len__', TOO_LARGE_ATTR): + if key == '__len__': return None if '(' not in key: #we have to treat that because the dict resolver is also used to directly resolve the global and local - #scopes (which already have the items directly) + #scopes (which already have the items directly) return dict[key] #ok, we have to iterate over the items to find the one that matches the id, because that's the only way #to actually find the reference from the string we have before. expected_id = int(key.split('(')[-1][:-1]) - for key, val in DictIterItems(dict): + for key, val in dict.items(): if id(key) == expected_id: return val @@ -245,15 +241,10 @@ class DictResolver: def getDictionary(self, dict): ret = {} - i = 0 - for key, val in DictIterItems(dict): - i += 1 + for key, val in dict.items(): #we need to add the id because otherwise we cannot find the real object to get its contents later on. key = '%s (%s)' % (self.keyStr(key), id(key)) ret[key] = val - if i > MAX_ITEMS_TO_HANDLE: - ret[TOO_LARGE_ATTR] = TOO_LARGE_MSG - break ret['__len__'] = len(dict) return ret @@ -270,25 +261,24 @@ class TupleResolver: #to enumerate tuples and lists @param var: that's the original attribute @param attribute: that's the key passed in the dict (as a string) ''' - if attribute in ('__len__', TOO_LARGE_ATTR): + if attribute == '__len__' or attribute == TOO_LARGE_ATTR: return None return var[int(attribute)] def getDictionary(self, var): + #return dict( [ (i, x) for i, x in enumerate(var) ] ) + # modified 'cause jython does not have enumerate support l = len(var) d = {} - - format_str = '%0' + str(int(len(str(l)))) + 'd' - - i = 0 - for item in var: - d[format_str % i] = item - i += 1 + + if l < MAX_ITEMS_TO_HANDLE: + format = '%0' + str(int(len(str(l)))) + 'd' - if i > MAX_ITEMS_TO_HANDLE: - d[TOO_LARGE_ATTR] = TOO_LARGE_MSG - break - + + for i, item in zip(range(l), var): + d[ format % i ] = item + else: + d[TOO_LARGE_ATTR] = TOO_LARGE_MSG d['__len__'] = len(var) return d @@ -303,7 +293,7 @@ class SetResolver: ''' def resolve(self, var, attribute): - if attribute in ('__len__', TOO_LARGE_ATTR): + if attribute == '__len__': return None attribute = int(attribute) @@ -315,16 +305,8 @@ class SetResolver: def getDictionary(self, var): d = {} - i = 0 for item in var: - i+= 1 - d[id(item)] = item - - if i > MAX_ITEMS_TO_HANDLE: - d[TOO_LARGE_ATTR] = TOO_LARGE_MSG - break - - + d[ id(item) ] = item d['__len__'] = len(var) return d @@ -343,7 +325,7 @@ class InstanceResolver: ret = {} declaredFields = obj.__class__.getDeclaredFields() - for i in xrange(len(declaredFields)): + for i in range(len(declaredFields)): name = declaredFields[i].getName() try: declaredFields[i].setAccessible(True) @@ -370,7 +352,7 @@ class JyArrayResolver: def getDictionary(self, obj): ret = {} - for i in xrange(len(obj)): + for i in range(len(obj)): ret[ i ] = obj[i] ret['__len__'] = len(obj) @@ -385,24 +367,13 @@ class NdArrayResolver: This resolves a numpy ndarray returning some metadata about the NDArray ''' - def is_numeric(self, obj): - if not hasattr(obj, 'dtype'): - return False - return obj.dtype.kind in 'biufc' - def resolve(self, obj, attribute): if attribute == '__internals__': return defaultResolver.getDictionary(obj) if attribute == 'min': - if self.is_numeric(obj): - return obj.min() - else: - return None + return obj.min() if attribute == 'max': - if self.is_numeric(obj): - return obj.max() - else: - return None + return obj.max() if attribute == 'shape': return obj.shape if attribute == 'dtype': @@ -418,12 +389,8 @@ class NdArrayResolver: ret['min'] = 'ndarray too big, calculating min would slow down debugging' ret['max'] = 'ndarray too big, calculating max would slow down debugging' else: - if self.is_numeric(obj): - ret['min'] = obj.min() - ret['max'] = obj.max() - else: - ret['min'] = 'not a numeric object' - ret['max'] = 'not a numeric object' + ret['min'] = obj.min() + ret['max'] = obj.max() ret['shape'] = obj.shape ret['dtype'] = obj.dtype ret['size'] = obj.size diff --git a/python/helpers/pydev/pydevd_signature.py b/python/helpers/pydev/pydevd_signature.py index d7b37c84cb76..e11bb5dd446b 100644 --- a/python/helpers/pydev/pydevd_signature.py +++ b/python/helpers/pydev/pydevd_signature.py @@ -1,17 +1,11 @@ import inspect +import trace import os -try: - import trace -except ImportError: - pass -else: - trace._warn = lambda *args: None # workaround for http://bugs.python.org/issue17143 (PY-8706) - +trace._warn = lambda *args: None # workaround for http://bugs.python.org/issue17143 (PY-8706) import gc from pydevd_comm import CMD_SIGNATURE_CALL_TRACE, NetCommand import pydevd_vars -from pydevd_constants import xrange class Signature(object): def __init__(self, file, name): @@ -49,7 +43,7 @@ class SignatureFactory(object): locals = frame.f_locals filename, modulename, funcname = self.file_module_function_of(frame) res = Signature(filename, funcname) - for i in xrange(0, code.co_argcount): + for i in range(0, code.co_argcount): name = code.co_varnames[i] tp = type(locals[name]) class_name = tp.__name__ @@ -129,8 +123,9 @@ def create_signature_message(signature): return NetCommand(CMD_SIGNATURE_CALL_TRACE, 0, cmdText) def sendSignatureCallTrace(dbg, frame, filename): - if dbg.signature_factory.is_in_scope(filename): - dbg.writer.addCommand(create_signature_message(dbg.signature_factory.create_signature(frame))) + if dbg.signature_factory: + if dbg.signature_factory.is_in_scope(filename): + dbg.writer.addCommand(create_signature_message(dbg.signature_factory.create_signature(frame))) diff --git a/python/helpers/pydev/pydevd_stackless.py b/python/helpers/pydev/pydevd_stackless.py index c2fd508e05d4..21ba86a00e39 100644 --- a/python/helpers/pydev/pydevd_stackless.py +++ b/python/helpers/pydev/pydevd_stackless.py @@ -7,7 +7,6 @@ from pydevd_comm import GetGlobalDebugger import weakref from pydevd_file_utils import GetFilenameAndBase from pydevd import DONT_TRACE -from pydevd_constants import DictItems # Used so that we don't loose the id (because we'll remove when it's not alive and would generate a new id for the @@ -196,7 +195,7 @@ def _schedule_callback(prev, next): register_tasklet_info(prev) try: - for tasklet_ref, tasklet_info in DictItems(_weak_tasklet_registered_to_info): # Make sure it's a copy! + for tasklet_ref, tasklet_info in list(_weak_tasklet_registered_to_info.items()): # Make sure it's a copy! tasklet = tasklet_ref() if tasklet is None or not tasklet.alive: # Garbage-collected already! @@ -270,7 +269,7 @@ if not hasattr(stackless.tasklet, "trace_function"): register_tasklet_info(prev) try: - for tasklet_ref, tasklet_info in DictItems(_weak_tasklet_registered_to_info): # Make sure it's a copy! + for tasklet_ref, tasklet_info in list(_weak_tasklet_registered_to_info.items()): # Make sure it's a copy! tasklet = tasklet_ref() if tasklet is None or not tasklet.alive: # Garbage-collected already! diff --git a/python/helpers/pydev/pydevd_tracing.py b/python/helpers/pydev/pydevd_tracing.py index d362462013a9..7bc1ba5c2c23 100644 --- a/python/helpers/pydev/pydevd_tracing.py +++ b/python/helpers/pydev/pydevd_tracing.py @@ -1,5 +1,4 @@ from pydevd_constants import * #@UnusedWildImport -from _pydev_imps import _pydev_thread try: import cStringIO as StringIO #may not always be available @UnusedImport @@ -9,6 +8,10 @@ except: except: import io as StringIO +if USE_LIB_COPY: + import _pydev_threading as threading +else: + import threading import sys #@Reimport import traceback @@ -18,7 +21,7 @@ class TracingFunctionHolder: ''' _original_tracing = None _warn = True - _lock = _pydev_thread.allocate_lock() + _lock = threading.Lock() _traceback_limit = 1 _warnings_shown = {} diff --git a/python/helpers/pydev/pydevd_vars.py b/python/helpers/pydev/pydevd_vars.py index e53c3ffb4342..79bcb5fba697 100644 --- a/python/helpers/pydev/pydevd_vars.py +++ b/python/helpers/pydev/pydevd_vars.py @@ -3,11 +3,11 @@ """ import pickle from django_frame import DjangoTemplateFrame +from pydevd_constants import * #@UnusedWildImport from types import * #@UnusedWildImport from pydevd_custom_frames import getCustomFrame from pydevd_xml import * -from _pydev_imps import _pydev_thread try: from StringIO import StringIO @@ -15,10 +15,14 @@ except ImportError: from io import StringIO import sys #@Reimport -import _pydev_threading as threading +if USE_LIB_COPY: + import _pydev_threading as threading +else: + import threading +import pydevd_resolver import traceback import pydevd_save_locals -from pydev_imports import Exec, execfile +from pydev_imports import Exec, quote, execfile try: import types @@ -67,7 +71,7 @@ def dumpFrames(thread_id): # AdditionalFramesContainer #=============================================================================== class AdditionalFramesContainer: - lock = _pydev_thread.allocate_lock() + lock = threading.Lock() additional_frames = {} #dict of dicts @@ -200,7 +204,7 @@ def getVariable(thread_id, frame_id, scope, attrs): attrList = [] if scope == 'EXPRESSION': - for count in xrange(len(attrList)): + for count in range(len(attrList)): if count == 0: # An Expression can be in any scope (globals/locals), therefore it needs to evaluated as an expression var = evaluateExpression(thread_id, frame_id, attrList[count], False) diff --git a/python/helpers/pydev/runfiles.py b/python/helpers/pydev/runfiles.py index c2db611055c4..67c88be4fe7c 100644 --- a/python/helpers/pydev/runfiles.py +++ b/python/helpers/pydev/runfiles.py @@ -75,7 +75,7 @@ def main(): if test_framework == 0: - return pydev_runfiles.main(configuration) #Note: still doesn't return a proper value. + pydev_runfiles.main(configuration) else: #We'll convert the parameters to what nose or py.test expects. @@ -144,8 +144,7 @@ def main(): import pydev_runfiles_nose PYDEV_NOSE_PLUGIN_SINGLETON = pydev_runfiles_nose.StartPydevNosePluginSingleton(configuration) argv.append('--with-pydevplugin') - # Return 'not' because it will return 'success' (so, exit == 0 if success) - return not nose.run(argv=argv, addplugins=[PYDEV_NOSE_PLUGIN_SINGLETON]) + nose.run(argv=argv, addplugins=[PYDEV_NOSE_PLUGIN_SINGLETON]) elif test_framework == PY_TEST_FRAMEWORK: if DEBUG: @@ -190,7 +189,7 @@ def main(): argv.append('-p') argv.append('pydev_runfiles_pytest2') - return pytest.main(argv) + pytest.main(argv) else: raise AssertionError('Cannot handle test framework: %s at this point.' % (test_framework,)) diff --git a/python/helpers/pydev/tests/test_get_referrers.py b/python/helpers/pydev/tests/test_get_referrers.py index 8284b2779c40..87f24cd12c75 100644 --- a/python/helpers/pydev/tests/test_get_referrers.py +++ b/python/helpers/pydev/tests/test_get_referrers.py @@ -1,7 +1,22 @@ +import os.path import sys +import weakref import threading import time +IS_JYTHON = sys.platform.find('java') != -1 + +try: + this_file_name = __file__ +except NameError: + # stupid jython. plain old __file__ isnt working for some reason + import test_runfiles #@UnresolvedImport - importing the module itself + this_file_name = test_runfiles.__file__ + + +desired_runfiles_path = os.path.normpath(os.path.dirname(this_file_name) + "/..") +sys.path.insert(0, desired_runfiles_path) + import unittest import pydevd_referrers from pydev_imports import StringIO diff --git a/python/helpers/pydev/tests/test_jyserver.py b/python/helpers/pydev/tests/test_jyserver.py index 12be8bcf5b1b..8765400ae39d 100644 --- a/python/helpers/pydev/tests/test_jyserver.py +++ b/python/helpers/pydev/tests/test_jyserver.py @@ -36,15 +36,10 @@ class Test(unittest.TestCase): unittest.TestCase.tearDown(self) def testIt(self): - if not IS_JYTHON: - return dbg('ok') def testMessage(self): - if not IS_JYTHON: - return t = jycompletionserver.T(0) - t.exit_process_on_kill = False l = [] l.append(('Def', 'description' , 'args')) @@ -70,8 +65,6 @@ class Test(unittest.TestCase): def testCompletionSocketsAndMessages(self): - if not IS_JYTHON: - return dbg('testCompletionSocketsAndMessages') t, socket = self.createConnections() self.socket = socket @@ -128,7 +121,6 @@ class Test(unittest.TestCase): Creates the connections needed for testing. ''' t = jycompletionserver.T(p1) - t.exit_process_on_kill = False t.start() diff --git a/python/helpers/pydev/tests/test_jysimpleTipper.py b/python/helpers/pydev/tests/test_jysimpleTipper.py index 064f8680584a..10fc8f53a388 100644 --- a/python/helpers/pydev/tests/test_jysimpleTipper.py +++ b/python/helpers/pydev/tests/test_jysimpleTipper.py @@ -4,14 +4,17 @@ import unittest import os import sys +#make it as if we were executing from the directory above this one (so that we can use pycompletionserver +#without the need for it being in the pythonpath) +sys.argv[0] = os.path.dirname(sys.argv[0]) +#twice the dirname to get the previous level from this file. +sys.path.insert(1, os.path.join(os.path.dirname(sys.argv[0]))) #this does not work (they must be in the system pythonpath) #sys.path.insert(1, r"D:\bin\eclipse321\plugins\org.junit_3.8.1\junit.jar" ) #some late loading jar tests #sys.path.insert(1, r"D:\bin\eclipse331_1\plugins\org.apache.ant_1.7.0.v200706080842\lib\ant.jar" ) #some late loading jar tests -IS_JYTHON = 0 if sys.platform.find('java') != -1: - IS_JYTHON = 1 from _pydev_jy_imports_tipper import ismethod from _pydev_jy_imports_tipper import isclass from _pydev_jy_imports_tipper import dirObj @@ -22,6 +25,8 @@ if sys.platform.find('java') != -1: from java.lang.System import arraycopy #@UnresolvedImport from java.lang.System import out #@UnresolvedImport import java.lang.String #@UnresolvedImport + import org.python.core.PyDictionary #@UnresolvedImport + __DBG = 0 def dbg(s): @@ -231,24 +236,22 @@ class TestCompl(unittest.TestCase): assert isMet[1][0].basicAsStr() == "function:met2 args=['arg1', 'arg2'], varargs=vararg, kwargs=kwarg, docs:docmet2" assert not isclass(met2) - -if not IS_JYTHON: - # Disable tests if not running under Jython - class TestMod(unittest.TestCase): - pass - class TestCompl(TestMod): - pass - class TestSearch(TestMod): - pass if __name__ == '__main__': - #Only run if jython - suite = unittest.makeSuite(TestCompl) - suite2 = unittest.makeSuite(TestMod) - suite3 = unittest.makeSuite(TestSearch) - - unittest.TextTestRunner(verbosity=1).run(suite) - unittest.TextTestRunner(verbosity=1).run(suite2) - unittest.TextTestRunner(verbosity=1).run(suite3) + if sys.platform.find('java') != -1: + #Only run if jython + suite = unittest.makeSuite(TestCompl) + suite2 = unittest.makeSuite(TestMod) + suite3 = unittest.makeSuite(TestSearch) + unittest.TextTestRunner(verbosity=1).run(suite) + unittest.TextTestRunner(verbosity=1).run(suite2) + unittest.TextTestRunner(verbosity=1).run(suite3) + +# suite.addTest(Test('testCase12')) +# suite = unittest.TestSuite() +# unittest.TextTestRunner(verbosity=1).run(suite) + + else: + sys.stdout.write('Not running jython tests for non-java platform: %s' % sys.platform) diff --git a/python/helpers/pydev/tests/test_pydev_ipython_011.py b/python/helpers/pydev/tests/test_pydev_ipython_011.py index dc4684f35f3d..3cfa70fd0112 100644 --- a/python/helpers/pydev/tests/test_pydev_ipython_011.py +++ b/python/helpers/pydev/tests/test_pydev_ipython_011.py @@ -7,87 +7,81 @@ from pydev_imports import StringIO, SimpleXMLRPCServer from pydev_localhost import get_localhost from pydev_console_utils import StdIn import socket -from pydev_ipython_console_011 import get_pydev_frontend -import time -try: - xrange -except: - xrange = range +# make it as if we were executing from the directory above this one +sys.argv[0] = os.path.dirname(sys.argv[0]) +# twice the dirname to get the previous level from this file. +sys.path.insert(1, os.path.join(os.path.dirname(sys.argv[0]))) +# PyDevFrontEnd depends on singleton in IPython, so you +# can't make multiple versions. So we reuse front_end for +# all the tests + +orig_stdout = sys.stdout +orig_stderr = sys.stderr + +stdout = sys.stdout = StringIO() +stderr = sys.stderr = StringIO() + +from pydev_ipython_console_011 import PyDevFrontEnd +s = socket.socket() +s.bind(('', 0)) +client_port = s.getsockname()[1] +s.close() +front_end = PyDevFrontEnd(get_localhost(), client_port) + + +def addExec(code, expected_more=False): + more = front_end.addExec(code) + eq_(expected_more, more) class TestBase(unittest.TestCase): - - def setUp(self): - # PyDevFrontEnd depends on singleton in IPython, so you - # can't make multiple versions. So we reuse self.front_end for - # all the tests - self.front_end = get_pydev_frontend(get_localhost(), 0) - - from pydev_ipython.inputhook import set_return_control_callback - set_return_control_callback(lambda:True) - self.front_end.clearBuffer() - + front_end.input_splitter.reset() + stdout.truncate(0) + stdout.seek(0) + stderr.truncate(0) + stderr.seek(0) def tearDown(self): pass - - def addExec(self, code, expected_more=False): - more = self.front_end.addExec(code) - eq_(expected_more, more) - - def redirectStdout(self): - from IPython.utils import io - - self.original_stdout = sys.stdout - sys.stdout = io.stdout = StringIO() - - def restoreStdout(self): - from IPython.utils import io - io.stdout = sys.stdout = self.original_stdout class TestPyDevFrontEnd(TestBase): - def testAddExec_1(self): - self.addExec('if True:', True) - + addExec('if True:', True) def testAddExec_2(self): - #Change: 'more' must now be controlled in the client side after the initial 'True' returned. - self.addExec('if True:\n testAddExec_a = 10\n', False) - assert 'testAddExec_a' in self.front_end.getNamespace() - + addExec('if True:\n testAddExec_a = 10\n', True) def testAddExec_3(self): - assert 'testAddExec_x' not in self.front_end.getNamespace() - self.addExec('if True:\n testAddExec_x = 10\n\n') - assert 'testAddExec_x' in self.front_end.getNamespace() - eq_(self.front_end.getNamespace()['testAddExec_x'], 10) + assert 'testAddExec_a' not in front_end.getNamespace() + addExec('if True:\n testAddExec_a = 10\n\n') + assert 'testAddExec_a' in front_end.getNamespace() + eq_(front_end.getNamespace()['testAddExec_a'], 10) def testGetNamespace(self): - assert 'testGetNamespace_a' not in self.front_end.getNamespace() - self.addExec('testGetNamespace_a = 10') - assert 'testGetNamespace_a' in self.front_end.getNamespace() - eq_(self.front_end.getNamespace()['testGetNamespace_a'], 10) + assert 'testGetNamespace_a' not in front_end.getNamespace() + addExec('testGetNamespace_a = 10') + assert 'testGetNamespace_a' in front_end.getNamespace() + eq_(front_end.getNamespace()['testGetNamespace_a'], 10) def testComplete(self): - unused_text, matches = self.front_end.complete('%') + unused_text, matches = front_end.complete('%') assert len(matches) > 1, 'at least one magic should appear in completions' def testCompleteDoesNotDoPythonMatches(self): # Test that IPython's completions do not do the things that # PyDev's completions will handle - self.addExec('testComplete_a = 5') - self.addExec('testComplete_b = 10') - self.addExec('testComplete_c = 15') - unused_text, matches = self.front_end.complete('testComplete_') + addExec('testComplete_a = 5') + addExec('testComplete_b = 10') + addExec('testComplete_c = 15') + unused_text, matches = front_end.complete('testComplete_') assert len(matches) == 0 def testGetCompletions_1(self): # Test the merged completions include the standard completions - self.addExec('testComplete_a = 5') - self.addExec('testComplete_b = 10') - self.addExec('testComplete_c = 15') - res = self.front_end.getCompletions('testComplete_', 'testComplete_') + addExec('testComplete_a = 5') + addExec('testComplete_b = 10') + addExec('testComplete_c = 15') + res = front_end.getCompletions('testComplete_', 'testComplete_') matches = [f[0] for f in res] assert len(matches) == 3 eq_(set(['testComplete_a', 'testComplete_b', 'testComplete_c']), set(matches)) @@ -96,80 +90,60 @@ class TestPyDevFrontEnd(TestBase): # Test that we get IPython completions in results # we do this by checking kw completion which PyDev does # not do by default - self.addExec('def ccc(ABC=123): pass') - res = self.front_end.getCompletions('ccc(', '') + addExec('def ccc(ABC=123): pass') + res = front_end.getCompletions('ccc(', '') matches = [f[0] for f in res] assert 'ABC=' in matches def testGetCompletions_3(self): # Test that magics return IPYTHON magic as type - res = self.front_end.getCompletions('%cd', '%cd') + res = front_end.getCompletions('%cd', '%cd') assert len(res) == 1 eq_(res[0][3], '12') # '12' == IToken.TYPE_IPYTHON_MAGIC assert len(res[0][1]) > 100, 'docstring for %cd should be a reasonably long string' class TestRunningCode(TestBase): def testPrint(self): - self.redirectStdout() - try: - self.addExec('print("output")') - eq_(sys.stdout.getvalue(), 'output\n') - finally: - self.restoreStdout() + addExec('print("output")') + eq_(stdout.getvalue(), 'output\n') def testQuestionMark_1(self): - self.redirectStdout() - try: - self.addExec('?') - assert len(sys.stdout.getvalue()) > 1000, 'IPython help should be pretty big' - finally: - self.restoreStdout() + addExec('?') + assert len(stdout.getvalue()) > 1000, 'IPython help should be pretty big' def testQuestionMark_2(self): - self.redirectStdout() - try: - self.addExec('int?') - assert sys.stdout.getvalue().find('Convert') != -1 - finally: - self.restoreStdout() + addExec('int?') + assert stdout.getvalue().find('Convert') != -1 def testGui(self): - try: - import Tkinter - except: - return - else: - from pydev_ipython.inputhook import get_inputhook - assert get_inputhook() is None - self.addExec('%gui tk') - # we can't test the GUI works here because we aren't connected to XML-RPC so - # nowhere for hook to run - assert get_inputhook() is not None - self.addExec('%gui none') - assert get_inputhook() is None + from pydev_ipython.inputhook import get_inputhook, set_stdin_file + set_stdin_file(sys.stdin) + assert get_inputhook() is None + addExec('%gui tk') + # we can't test the GUI works here because we aren't connected to XML-RPC so + # nowhere for hook to run + assert get_inputhook() is not None + addExec('%gui none') + assert get_inputhook() is None def testHistory(self): ''' Make sure commands are added to IPython's history ''' - self.redirectStdout() - try: - self.addExec('a=1') - self.addExec('b=2') - _ih = self.front_end.getNamespace()['_ih'] - eq_(_ih[-1], 'b=2') - eq_(_ih[-2], 'a=1') - - self.addExec('history') - hist = sys.stdout.getvalue().split('\n') - eq_(hist[-1], '') - eq_(hist[-2], 'history') - eq_(hist[-3], 'b=2') - eq_(hist[-4], 'a=1') - finally: - self.restoreStdout() + addExec('a=1') + addExec('b=2') + _ih = front_end.getNamespace()['_ih'] + eq_(_ih[-1], 'b=2') + eq_(_ih[-2], 'a=1') + + addExec('history') + hist = stdout.getvalue().split('\n') + eq_(hist[-1], '') + eq_(hist[-2], 'history') + eq_(hist[-3], 'b=2') + eq_(hist[-4], 'a=1') def testEdit(self): - ''' Make sure we can issue an edit command''' + ''' Make sure we can issue an edit command ''' called_RequestInput = [False] called_IPythonEditor = [False] def startClientThread(client_port): @@ -189,47 +163,26 @@ class TestRunningCode(TestBase): handle_request_input = HandleRequestInput() import pydev_localhost - self.client_server = client_server = SimpleXMLRPCServer( - (pydev_localhost.get_localhost(), self.client_port), logRequests=False) + client_server = SimpleXMLRPCServer((pydev_localhost.get_localhost(), self.client_port), logRequests=False) client_server.register_function(handle_request_input.RequestInput) client_server.register_function(handle_request_input.IPythonEditor) client_server.serve_forever() - - def shutdown(self): - return - self.client_server.shutdown() client_thread = ClientThread(client_port) client_thread.setDaemon(True) client_thread.start() return client_thread - # PyDevFrontEnd depends on singleton in IPython, so you - # can't make multiple versions. So we reuse self.front_end for - # all the tests - s = socket.socket() - s.bind(('', 0)) - self.client_port = client_port = s.getsockname()[1] - s.close() - self.front_end = get_pydev_frontend(get_localhost(), client_port) - - client_thread = startClientThread(self.client_port) + startClientThread(client_port) orig_stdin = sys.stdin - sys.stdin = StdIn(self, get_localhost(), self.client_port) + sys.stdin = StdIn(self, get_localhost(), client_port) try: filename = 'made_up_file.py' - self.addExec('%edit ' + filename) - - for i in xrange(10): - if called_IPythonEditor[0] == (os.path.abspath(filename), '0'): - break - time.sleep(.1) - - eq_(called_IPythonEditor[0], (os.path.abspath(filename), '0')) + addExec('%edit ' + filename) + eq_(called_IPythonEditor[0], (os.path.abspath(filename), 0)) assert called_RequestInput[0], "Make sure the 'wait' parameter has been respected" finally: sys.stdin = orig_stdin - client_thread.shutdown() if __name__ == '__main__': diff --git a/python/helpers/pydev/tests/test_pydevconsole.py b/python/helpers/pydev/tests/test_pydevconsole.py index 18421980ae82..9a9e3edaf124 100644 --- a/python/helpers/pydev/tests/test_pydevconsole.py +++ b/python/helpers/pydev/tests/test_pydevconsole.py @@ -1,6 +1,10 @@ import threading import unittest import sys +import os + +sys.argv[0] = os.path.dirname(sys.argv[0]) +sys.path.insert(1, os.path.join(os.path.dirname(sys.argv[0]))) import pydevconsole from pydev_imports import xmlrpclib, SimpleXMLRPCServer, StringIO @@ -15,112 +19,104 @@ except NameError: #======================================================================================================================= class Test(unittest.TestCase): - def testConsoleHello(self): + def setUp(self): self.original_stdout = sys.stdout sys.stdout = StringIO() - - try: - client_port, _server_port = self.getFreeAddresses() - client_thread = self.startClientThread(client_port) #@UnusedVariable - import time - time.sleep(.3) #let's give it some time to start the threads - - import pydev_localhost - interpreter = pydevconsole.InterpreterInterface(pydev_localhost.get_localhost(), client_port, threading.currentThread()) - - (result,) = interpreter.hello("Hello pydevconsole") - self.assertEqual(result, "Hello eclipse") - finally: - sys.stdout = self.original_stdout + + + def tearDown(self): + ret = sys.stdout #@UnusedVariable + sys.stdout = self.original_stdout + #print_ ret.getvalue() -- use to see test output + + def testConsoleHello(self): + client_port, _server_port = self.getFreeAddresses() + client_thread = self.startClientThread(client_port) #@UnusedVariable + import time + time.sleep(.3) #let's give it some time to start the threads + + import pydev_localhost + interpreter = pydevconsole.InterpreterInterface(pydev_localhost.get_localhost(), client_port, server=None) + + (result,) = interpreter.hello("Hello pydevconsole") + self.assertEqual(result, "Hello eclipse") def testConsoleRequests(self): - self.original_stdout = sys.stdout - sys.stdout = StringIO() - + client_port, _server_port = self.getFreeAddresses() + client_thread = self.startClientThread(client_port) #@UnusedVariable + import time + time.sleep(.3) #let's give it some time to start the threads + + import pydev_localhost + interpreter = pydevconsole.InterpreterInterface(pydev_localhost.get_localhost(), client_port, server=None) + interpreter.addExec('class Foo:') + interpreter.addExec(' CONSTANT=1') + interpreter.addExec('') + interpreter.addExec('foo=Foo()') + interpreter.addExec('foo.__doc__=None') + interpreter.addExec('val = %s()' % (raw_input_name,)) + interpreter.addExec('50') + interpreter.addExec('print (val)') + found = sys.stdout.getvalue().split() try: - client_port, _server_port = self.getFreeAddresses() - client_thread = self.startClientThread(client_port) #@UnusedVariable - import time - time.sleep(.3) #let's give it some time to start the threads - - import pydev_localhost - from pydev_console_utils import CodeFragment - - interpreter = pydevconsole.InterpreterInterface(pydev_localhost.get_localhost(), client_port, threading.currentThread()) - sys.stdout = StringIO() - interpreter.addExec(CodeFragment('class Foo:')) - interpreter.addExec(CodeFragment(' CONSTANT=1')) - interpreter.addExec(CodeFragment('')) - interpreter.addExec(CodeFragment('foo=Foo()')) - interpreter.addExec(CodeFragment('foo.__doc__=None')) - interpreter.addExec(CodeFragment('val = %s()' % (raw_input_name,))) - interpreter.addExec(CodeFragment('50')) - interpreter.addExec(CodeFragment('print (val)')) - found = sys.stdout.getvalue().split() - try: - self.assertEqual(['50', 'input_request'], found) - except: - self.assertEqual(['input_request'], found) #IPython - - comps = interpreter.getCompletions('foo.', 'foo.') - self.assert_( - ('CONSTANT', '', '', '3') in comps or ('CONSTANT', '', '', '4') in comps, \ - 'Found: %s' % comps - ) - - comps = interpreter.getCompletions('"".', '"".') - self.assert_( - ('__add__', 'x.__add__(y) <==> x+y', '', '3') in comps or - ('__add__', '', '', '4') in comps or - ('__add__', 'x.__add__(y) <==> x+y\r\nx.__add__(y) <==> x+y', '()', '2') in comps or - ('__add__', 'x.\n__add__(y) <==> x+yx.\n__add__(y) <==> x+y', '()', '2'), - 'Did not find __add__ in : %s' % (comps,) - ) - - - completions = interpreter.getCompletions('', '') - for c in completions: - if c[0] == 'AssertionError': - break - else: - self.fail('Could not find AssertionError') - - completions = interpreter.getCompletions('Assert', 'Assert') - for c in completions: - if c[0] == 'RuntimeError': - self.fail('Did not expect to find RuntimeError there') - - self.assert_(('__doc__', None, '', '3') not in interpreter.getCompletions('foo.CO', 'foo.')) - - comps = interpreter.getCompletions('va', 'va') - self.assert_(('val', '', '', '3') in comps or ('val', '', '', '4') in comps) - - interpreter.addExec(CodeFragment('s = "mystring"')) - - desc = interpreter.getDescription('val') - self.assert_(desc.find('str(object) -> string') >= 0 or - desc == "'input_request'" or - desc.find('str(string[, encoding[, errors]]) -> str') >= 0 or - desc.find('str(Char* value)') >= 0 or - desc.find('str(object=\'\') -> string') >= 0 or - desc.find('str(value: Char*)') >= 0 or - desc.find('str(object=\'\') -> str') >= 0 - , - 'Could not find what was needed in %s' % desc) - - desc = interpreter.getDescription('val.join') - self.assert_(desc.find('S.join(sequence) -> string') >= 0 or - desc.find('S.join(sequence) -> str') >= 0 or - desc.find('S.join(iterable) -> string') >= 0 or - desc == "" or - desc == "" or - desc.find('str join(str self, list sequence)') >= 0 or - desc.find('S.join(iterable) -> str') >= 0 or - desc.find('join(self: str, sequence: list) -> str') >= 0, - "Could not recognize: %s" % (desc,)) - finally: - sys.stdout = self.original_stdout + self.assertEqual(['50', 'input_request'], found) + except: + self.assertEqual(['input_request'], found) #IPython + + comps = interpreter.getCompletions('foo.', 'foo.') + self.assert_( + ('CONSTANT', '', '', '3') in comps or ('CONSTANT', '', '', '4') in comps, \ + 'Found: %s' % comps + ) + + comps = interpreter.getCompletions('"".', '"".') + self.assert_( + ('__add__', 'x.__add__(y) <==> x+y', '', '3') in comps or + ('__add__', '', '', '4') in comps or + ('__add__', 'x.__add__(y) <==> x+y\r\nx.__add__(y) <==> x+y', '()', '2') in comps or + ('__add__', 'x.\n__add__(y) <==> x+yx.\n__add__(y) <==> x+y', '()', '2'), + 'Did not find __add__ in : %s' % (comps,) + ) + + + completions = interpreter.getCompletions('', '') + for c in completions: + if c[0] == 'AssertionError': + break + else: + self.fail('Could not find AssertionError') + + completions = interpreter.getCompletions('Assert', 'Assert') + for c in completions: + if c[0] == 'RuntimeError': + self.fail('Did not expect to find RuntimeError there') + + self.assert_(('__doc__', None, '', '3') not in interpreter.getCompletions('foo.CO', 'foo.')) + + comps = interpreter.getCompletions('va', 'va') + self.assert_(('val', '', '', '3') in comps or ('val', '', '', '4') in comps) + + interpreter.addExec('s = "mystring"') + + desc = interpreter.getDescription('val') + self.assert_(desc.find('str(object) -> string') >= 0 or + desc == "'input_request'" or + desc.find('str(string[, encoding[, errors]]) -> str') >= 0 or + desc.find('str(Char* value)') >= 0 or + desc.find('str(value: Char*)') >= 0, + 'Could not find what was needed in %s' % desc) + + desc = interpreter.getDescription('val.join') + self.assert_(desc.find('S.join(sequence) -> string') >= 0 or + desc.find('S.join(sequence) -> str') >= 0 or + desc.find('S.join(iterable) -> string') >= 0 or + desc == "" or + desc == "" or + desc.find('str join(str self, list sequence)') >= 0 or + desc.find('S.join(iterable) -> str') >= 0 or + desc.find('join(self: str, sequence: list) -> str') >= 0, + "Could not recognize: %s" % (desc,)) def startClientThread(self, client_port): @@ -128,28 +124,19 @@ class Test(unittest.TestCase): def __init__(self, client_port): threading.Thread.__init__(self) self.client_port = client_port - def run(self): class HandleRequestInput: def RequestInput(self): - client_thread.requested_input = True return 'input_request' - - def NotifyFinished(self, *args, **kwargs): - client_thread.notified_finished += 1 - return 1 - + handle_request_input = HandleRequestInput() - + import pydev_localhost client_server = SimpleXMLRPCServer((pydev_localhost.get_localhost(), self.client_port), logRequests=False) client_server.register_function(handle_request_input.RequestInput) - client_server.register_function(handle_request_input.NotifyFinished) client_server.serve_forever() - + client_thread = ClientThread(client_port) - client_thread.requested_input = False - client_thread.notified_finished = 0 client_thread.setDaemon(True) client_thread.start() return client_thread @@ -207,50 +194,34 @@ class Test(unittest.TestCase): def testServer(self): - self.original_stdout = sys.stdout - sys.stdout = StringIO() - try: - client_port, server_port = self.getFreeAddresses() - class ServerThread(threading.Thread): - def __init__(self, client_port, server_port): - threading.Thread.__init__(self) - self.client_port = client_port - self.server_port = server_port - - def run(self): - import pydev_localhost - pydevconsole.StartServer(pydev_localhost.get_localhost(), self.server_port, self.client_port) - server_thread = ServerThread(client_port, server_port) - server_thread.setDaemon(True) - server_thread.start() - - client_thread = self.startClientThread(client_port) #@UnusedVariable - - import time - time.sleep(.3) #let's give it some time to start the threads - sys.stdout = StringIO() - - import pydev_localhost - server = xmlrpclib.Server('http://%s:%s' % (pydev_localhost.get_localhost(), server_port)) - server.execLine('class Foo:') - server.execLine(' pass') - server.execLine('') - server.execLine('foo = Foo()') - server.execLine('a = %s()' % (raw_input_name,)) - server.execLine('print (a)') - initial = time.time() - while not client_thread.requested_input: - if time.time() - initial > 2: - raise AssertionError('Did not get the return asked before the timeout.') - time.sleep(.1) - - while ['input_request'] != sys.stdout.getvalue().split(): - if time.time() - initial > 2: - break - time.sleep(.1) - self.assertEqual(['input_request'], sys.stdout.getvalue().split()) - finally: - sys.stdout = self.original_stdout + client_port, server_port = self.getFreeAddresses() + class ServerThread(threading.Thread): + def __init__(self, client_port, server_port): + threading.Thread.__init__(self) + self.client_port = client_port + self.server_port = server_port + + def run(self): + import pydev_localhost + pydevconsole.StartServer(pydev_localhost.get_localhost(), self.server_port, self.client_port) + server_thread = ServerThread(client_port, server_port) + server_thread.setDaemon(True) + server_thread.start() + + client_thread = self.startClientThread(client_port) #@UnusedVariable + + import time + time.sleep(.3) #let's give it some time to start the threads + + import pydev_localhost + server = xmlrpclib.Server('http://%s:%s' % (pydev_localhost.get_localhost(), server_port)) + server.addExec('class Foo:') + server.addExec(' pass') + server.addExec('') + server.addExec('foo = Foo()') + server.addExec('a = %s()' % (raw_input_name,)) + server.addExec('print (a)') + self.assertEqual(['input_request'], sys.stdout.getvalue().split()) #======================================================================================================================= # main diff --git a/python/helpers/pydev/tests/test_pyserver.py b/python/helpers/pydev/tests/test_pyserver.py index ea9daff14e39..a74876b8c8b9 100644 --- a/python/helpers/pydev/tests/test_pyserver.py +++ b/python/helpers/pydev/tests/test_pyserver.py @@ -3,7 +3,6 @@ ''' import sys import os -from _pydev_imps._pydev_thread import start_new_thread #make it as if we were executing from the directory above this one (so that we can use pycompletionserver #without the need for it being in the pythonpath) @@ -14,13 +13,6 @@ sys.path.insert(1, os.path.join(os.path.dirname(sys.argv[0]))) IS_PYTHON_3K = 0 if sys.platform.find('java') == -1: - try: - import __builtin__ #@UnusedImport - BUILTIN_MOD = '__builtin__' - except ImportError: - BUILTIN_MOD = 'builtins' - - try: import inspect @@ -49,7 +41,7 @@ if sys.platform.find('java') == -1: unittest.TestCase.tearDown(self) def testMessage(self): - t = pycompletionserver.CompletionServer(0) + t = pycompletionserver.T(0) l = [] l.append(('Def', 'description' , 'args')) @@ -70,14 +62,14 @@ if sys.platform.find('java') == -1: ''' Creates the connections needed for testing. ''' + t = pycompletionserver.T(p1) + + t.start() + server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((pycompletionserver.HOST, p1)) server.listen(1) #socket to receive messages. - t = pycompletionserver.CompletionServer(p1) - t.exit_process_on_kill = False - start_new_thread(t.run, ()) - s, addr = server.accept() return t, s @@ -114,8 +106,6 @@ if sys.platform.find('java') == -1: #math is a builtin and because of that, it starts with None as a file start = '@@COMPLETIONS(None,(__doc__,' start_2 = '@@COMPLETIONS(None,(__name__,' - if '/math.so,' in completions or '/math.cpython-33m.so,' in completions or '/math.cpython-34m.so,' in completions: - return self.assert_(completions.startswith(start) or completions.startswith(start_2), '%s DOESNT START WITH %s' % (completions, (start, start_2))) self.assert_('@@COMPLETIONS' in completions) @@ -123,7 +113,7 @@ if sys.platform.find('java') == -1: #now, test i - msg = quote_plus('%s.list' % BUILTIN_MOD) + msg = quote_plus('__builtin__.list') send(socket, "@@IMPORTS:%s\nEND@@" % msg) found = self.readMsg() self.assert_('sort' in found, 'Could not find sort in: %s' % (found,)) diff --git a/python/helpers/pydev/tests/test_simpleTipper.py b/python/helpers/pydev/tests/test_simpleTipper.py index 255a5218698f..f759ad60f678 100644 --- a/python/helpers/pydev/tests/test_simpleTipper.py +++ b/python/helpers/pydev/tests/test_simpleTipper.py @@ -1,7 +1,12 @@ ''' @author Fabio Zadrozny ''' +import os import sys +#make it as if we were executing from the directory above this one (so that we can use pycompletionserver +#without the need for it being in the pythonpath) +#twice the dirname to get the previous level from this file. +sys.path.insert(1, os.path.split(os.path.split(__file__)[0])[0]) try: import __builtin__ #@UnusedImport @@ -45,14 +50,13 @@ if sys.platform.find('java') == -1: pass def testImports5(self): - tip = _pydev_imports_tipper.GenerateTip('%s.list' % BUILTIN_MOD) + tip = _pydev_imports_tipper.GenerateTip('__builtin__.list') s = self.assertIn('sort', tip) self.CheckArgs( s, '(cmp=None, key=None, reverse=False)', '(self, object cmp, object key, bool reverse)', - '(self, cmp: object, key: object, reverse: bool)', - '(key=None, reverse=False)', + '(self, cmp: object, key: object, reverse: bool)' ) def testImports2a(self): @@ -60,24 +64,14 @@ if sys.platform.find('java') == -1: self.assertIn('__doc__', tips) def testImports2b(self): - try: - file - except: - pass - else: - tips = _pydev_imports_tipper.GenerateTip('%s' % BUILTIN_MOD) - t = self.assertIn('file' , tips) - self.assert_('->' in t[1].strip() or 'file' in t[1]) + tips = _pydev_imports_tipper.GenerateTip('%s' % BUILTIN_MOD) + t = self.assertIn('file' , tips) + self.assert_('->' in t[1].strip() or 'file' in t[1]) def testImports2c(self): - try: - file # file is not available on py 3 - except: - pass - else: - tips = _pydev_imports_tipper.GenerateTip('%s.file' % BUILTIN_MOD) - t = self.assertIn('readlines' , tips) - self.assert_('->' in t[1] or 'sizehint' in t[1]) + tips = _pydev_imports_tipper.GenerateTip('%s.file' % BUILTIN_MOD) + t = self.assertIn('readlines' , tips) + self.assert_('->' in t[1] or 'sizehint' in t[1]) def testImports(self): ''' @@ -116,9 +110,9 @@ if sys.platform.find('java') == -1: self.assertIn('RuntimeError' , tip) self.assertIn('RuntimeWarning' , tip) - # Remove cmp as it's not available on py 3 - #t = self.assertIn('cmp' , tip) - #self.CheckArgs(t, '(x, y)', '(object x, object y)', '(x: object, y: object)') #args + t = self.assertIn('cmp' , tip) + + self.CheckArgs(t, '(x, y)', '(object x, object y)', '(x: object, y: object)') #args t = self.assertIn('isinstance' , tip) self.CheckArgs(t, '(object, class_or_type_or_tuple)', '(object o, type typeinfo)', '(o: object, typeinfo: type)') #args diff --git a/python/helpers/pydev/tests_mainloop/gui-glut.py b/python/helpers/pydev/tests_mainloop/gui-glut.py index 34a16b454171..f05a4bc0beaf 100644 --- a/python/helpers/pydev/tests_mainloop/gui-glut.py +++ b/python/helpers/pydev/tests_mainloop/gui-glut.py @@ -9,44 +9,42 @@ To run this: 4) run: gl.glClearColor(1,1,1,1) """ -if __name__ == '__main__': +#!/usr/bin/env python +import sys +import OpenGL.GL as gl +import OpenGL.GLUT as glut - #!/usr/bin/env python - import sys - import OpenGL.GL as gl - import OpenGL.GLUT as glut - - def close(): - glut.glutDestroyWindow(glut.glutGetWindow()) - - def display(): - gl.glClear (gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT) - glut.glutSwapBuffers() - - def resize(width,height): - gl.glViewport(0, 0, width, height+4) - gl.glMatrixMode(gl.GL_PROJECTION) - gl.glLoadIdentity() - gl.glOrtho(0, width, 0, height+4, -1, 1) - gl.glMatrixMode(gl.GL_MODELVIEW) - - if glut.glutGetWindow() > 0: - interactive = True - glut.glutInit(sys.argv) - glut.glutInitDisplayMode(glut.GLUT_DOUBLE | - glut.GLUT_RGBA | - glut.GLUT_DEPTH) - else: - interactive = False - - glut.glutCreateWindow('gui-glut') - glut.glutDisplayFunc(display) - glut.glutReshapeFunc(resize) - # This is necessary on osx to be able to close the window - # (else the close button is disabled) - if sys.platform == 'darwin' and not bool(glut.HAVE_FREEGLUT): - glut.glutWMCloseFunc(close) - gl.glClearColor(0,0,0,1) - - if not interactive: - glut.glutMainLoop() +def close(): + glut.glutDestroyWindow(glut.glutGetWindow()) + +def display(): + gl.glClear (gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT) + glut.glutSwapBuffers() + +def resize(width,height): + gl.glViewport(0, 0, width, height+4) + gl.glMatrixMode(gl.GL_PROJECTION) + gl.glLoadIdentity() + gl.glOrtho(0, width, 0, height+4, -1, 1) + gl.glMatrixMode(gl.GL_MODELVIEW) + +if glut.glutGetWindow() > 0: + interactive = True + glut.glutInit(sys.argv) + glut.glutInitDisplayMode(glut.GLUT_DOUBLE | + glut.GLUT_RGBA | + glut.GLUT_DEPTH) +else: + interactive = False + +glut.glutCreateWindow('gui-glut') +glut.glutDisplayFunc(display) +glut.glutReshapeFunc(resize) +# This is necessary on osx to be able to close the window +# (else the close button is disabled) +if sys.platform == 'darwin' and not bool(glut.HAVE_FREEGLUT): + glut.glutWMCloseFunc(close) +gl.glClearColor(0,0,0,1) + +if not interactive: + glut.glutMainLoop() diff --git a/python/helpers/pydev/tests_mainloop/gui-gtk.py b/python/helpers/pydev/tests_mainloop/gui-gtk.py index 6df5c782e96a..978f8f9a25f3 100644 --- a/python/helpers/pydev/tests_mainloop/gui-gtk.py +++ b/python/helpers/pydev/tests_mainloop/gui-gtk.py @@ -8,28 +8,27 @@ To run this: interactive console """ -if __name__ == '__main__': - import pygtk - pygtk.require('2.0') - import gtk - - - def hello_world(wigdet, data=None): - print("Hello World") - - def delete_event(widget, event, data=None): - return False - - def destroy(widget, data=None): - gtk.main_quit() - - window = gtk.Window(gtk.WINDOW_TOPLEVEL) - window.connect("delete_event", delete_event) - window.connect("destroy", destroy) - button = gtk.Button("Hello World") - button.connect("clicked", hello_world, None) - - window.add(button) - button.show() - window.show() - +import pygtk +pygtk.require('2.0') +import gtk + + +def hello_world(wigdet, data=None): + print("Hello World") + +def delete_event(widget, event, data=None): + return False + +def destroy(widget, data=None): + gtk.main_quit() + +window = gtk.Window(gtk.WINDOW_TOPLEVEL) +window.connect("delete_event", delete_event) +window.connect("destroy", destroy) +button = gtk.Button("Hello World") +button.connect("clicked", hello_world, None) + +window.add(button) +button.show() +window.show() + diff --git a/python/helpers/pydev/tests_mainloop/gui-gtk3.py b/python/helpers/pydev/tests_mainloop/gui-gtk3.py index 6351d5235ded..a787f7ee9e65 100644 --- a/python/helpers/pydev/tests_mainloop/gui-gtk3.py +++ b/python/helpers/pydev/tests_mainloop/gui-gtk3.py @@ -8,26 +8,25 @@ To run this: interactive console """ -if __name__ == '__main__': - from gi.repository import Gtk - - - def hello_world(wigdet, data=None): - print("Hello World") - - def delete_event(widget, event, data=None): - return False - - def destroy(widget, data=None): - Gtk.main_quit() - - window = Gtk.Window(Gtk.WindowType.TOPLEVEL) - window.connect("delete_event", delete_event) - window.connect("destroy", destroy) - button = Gtk.Button("Hello World") - button.connect("clicked", hello_world, None) - - window.add(button) - button.show() - window.show() - +from gi.repository import Gtk + + +def hello_world(wigdet, data=None): + print("Hello World") + +def delete_event(widget, event, data=None): + return False + +def destroy(widget, data=None): + Gtk.main_quit() + +window = Gtk.Window(Gtk.WindowType.TOPLEVEL) +window.connect("delete_event", delete_event) +window.connect("destroy", destroy) +button = Gtk.Button("Hello World") +button.connect("clicked", hello_world, None) + +window.add(button) +button.show() +window.show() + diff --git a/python/helpers/pydev/tests_mainloop/gui-pyglet.py b/python/helpers/pydev/tests_mainloop/gui-pyglet.py index 70f1a7f64724..b646093e0967 100644 --- a/python/helpers/pydev/tests_mainloop/gui-pyglet.py +++ b/python/helpers/pydev/tests_mainloop/gui-pyglet.py @@ -8,21 +8,20 @@ To run this: interactive console """ -if __name__ == '__main__': - import pyglet - - - window = pyglet.window.Window() - label = pyglet.text.Label('Hello, world', - font_name='Times New Roman', - font_size=36, - x=window.width//2, y=window.height//2, - anchor_x='center', anchor_y='center') - @window.event - def on_close(): - window.close() - - @window.event - def on_draw(): - window.clear() - label.draw() +import pyglet + + +window = pyglet.window.Window() +label = pyglet.text.Label('Hello, world', + font_name='Times New Roman', + font_size=36, + x=window.width//2, y=window.height//2, + anchor_x='center', anchor_y='center') +@window.event +def on_close(): + window.close() + +@window.event +def on_draw(): + window.clear() + label.draw() diff --git a/python/helpers/pydev/tests_mainloop/gui-qt.py b/python/helpers/pydev/tests_mainloop/gui-qt.py index 398310d99662..c27cbd6ff1e6 100644 --- a/python/helpers/pydev/tests_mainloop/gui-qt.py +++ b/python/helpers/pydev/tests_mainloop/gui-qt.py @@ -10,26 +10,26 @@ To run this: Ref: Modified from http://zetcode.com/tutorials/pyqt4/firstprograms/ """ +import sys +from PyQt4 import QtGui, QtCore + +class SimpleWindow(QtGui.QWidget): + def __init__(self, parent=None): + QtGui.QWidget.__init__(self, parent) + + self.setGeometry(300, 300, 200, 80) + self.setWindowTitle('Hello World') + + quit = QtGui.QPushButton('Close', self) + quit.setGeometry(10, 10, 60, 35) + + self.connect(quit, QtCore.SIGNAL('clicked()'), + self, QtCore.SLOT('close()')) + if __name__ == '__main__': - from PyQt4 import QtGui, QtCore - - class SimpleWindow(QtGui.QWidget): - def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) - - self.setGeometry(300, 300, 200, 80) - self.setWindowTitle('Hello World') - - quit = QtGui.QPushButton('Close', self) - quit.setGeometry(10, 10, 60, 35) - - self.connect(quit, QtCore.SIGNAL('clicked()'), - self, QtCore.SLOT('close()')) - - if __name__ == '__main__': - app = QtCore.QCoreApplication.instance() - if app is None: - app = QtGui.QApplication([]) - - sw = SimpleWindow() - sw.show() + app = QtCore.QCoreApplication.instance() + if app is None: + app = QtGui.QApplication([]) + + sw = SimpleWindow() + sw.show() diff --git a/python/helpers/pydev/tests_mainloop/gui-tk.py b/python/helpers/pydev/tests_mainloop/gui-tk.py index 4cef45f91a4a..69ceb0b9f053 100644 --- a/python/helpers/pydev/tests_mainloop/gui-tk.py +++ b/python/helpers/pydev/tests_mainloop/gui-tk.py @@ -8,26 +8,24 @@ To run this: interactive console """ -if __name__ == '__main__': - - try: - from Tkinter import * - except: - # Python 3 - from tkinter import * - - class MyApp: - - def __init__(self, root): - frame = Frame(root) - frame.pack() - - self.button = Button(frame, text="Hello", command=self.hello_world) - self.button.pack(side=LEFT) - - def hello_world(self): - print("Hello World!") - - root = Tk() - - app = MyApp(root) +try: + from Tkinter import * +except: + # Python 3 + from tkinter import * + +class MyApp: + + def __init__(self, root): + frame = Frame(root) + frame.pack() + + self.button = Button(frame, text="Hello", command=self.hello_world) + self.button.pack(side=LEFT) + + def hello_world(self): + print("Hello World!") + +root = Tk() + +app = MyApp(root) diff --git a/python/helpers/pydev/tests_mainloop/gui-wx.py b/python/helpers/pydev/tests_mainloop/gui-wx.py index b9c28bfc63ab..2101e7f214d4 100644 --- a/python/helpers/pydev/tests_mainloop/gui-wx.py +++ b/python/helpers/pydev/tests_mainloop/gui-wx.py @@ -11,93 +11,91 @@ To run this: Ref: Modified from wxPython source code wxPython/samples/simple/simple.py """ +import wx + + +class MyFrame(wx.Frame): + """ + This is MyFrame. It just shows a few controls on a wxPanel, + and has a simple menu. + """ + def __init__(self, parent, title): + wx.Frame.__init__(self, parent, -1, title, + pos=(150, 150), size=(350, 200)) + + # Create the menubar + menuBar = wx.MenuBar() + + # and a menu + menu = wx.Menu() + + # add an item to the menu, using \tKeyName automatically + # creates an accelerator, the third param is some help text + # that will show up in the statusbar + menu.Append(wx.ID_EXIT, "E&xit\tAlt-X", "Exit this simple sample") + + # bind the menu event to an event handler + self.Bind(wx.EVT_MENU, self.OnTimeToClose, id=wx.ID_EXIT) + + # and put the menu on the menubar + menuBar.Append(menu, "&File") + self.SetMenuBar(menuBar) + + self.CreateStatusBar() + + # Now create the Panel to put the other controls on. + panel = wx.Panel(self) + + # and a few controls + text = wx.StaticText(panel, -1, "Hello World!") + text.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD)) + text.SetSize(text.GetBestSize()) + btn = wx.Button(panel, -1, "Close") + funbtn = wx.Button(panel, -1, "Just for fun...") + + # bind the button events to handlers + self.Bind(wx.EVT_BUTTON, self.OnTimeToClose, btn) + self.Bind(wx.EVT_BUTTON, self.OnFunButton, funbtn) + + # Use a sizer to layout the controls, stacked vertically and with + # a 10 pixel border around each + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(text, 0, wx.ALL, 10) + sizer.Add(btn, 0, wx.ALL, 10) + sizer.Add(funbtn, 0, wx.ALL, 10) + panel.SetSizer(sizer) + panel.Layout() + + + def OnTimeToClose(self, evt): + """Event handler for the button click.""" + print("See ya later!") + self.Close() + + def OnFunButton(self, evt): + """Event handler for the button click.""" + print("Having fun yet?") + + +class MyApp(wx.App): + def OnInit(self): + frame = MyFrame(None, "Simple wxPython App") + self.SetTopWindow(frame) + + print("Print statements go to this stdout window by default.") + + frame.Show(True) + return True + + if __name__ == '__main__': - import wx - - - class MyFrame(wx.Frame): - """ - This is MyFrame. It just shows a few controls on a wxPanel, - and has a simple menu. - """ - def __init__(self, parent, title): - wx.Frame.__init__(self, parent, -1, title, - pos=(150, 150), size=(350, 200)) - - # Create the menubar - menuBar = wx.MenuBar() - - # and a menu - menu = wx.Menu() - - # add an item to the menu, using \tKeyName automatically - # creates an accelerator, the third param is some help text - # that will show up in the statusbar - menu.Append(wx.ID_EXIT, "E&xit\tAlt-X", "Exit this simple sample") - - # bind the menu event to an event handler - self.Bind(wx.EVT_MENU, self.OnTimeToClose, id=wx.ID_EXIT) - - # and put the menu on the menubar - menuBar.Append(menu, "&File") - self.SetMenuBar(menuBar) - - self.CreateStatusBar() - - # Now create the Panel to put the other controls on. - panel = wx.Panel(self) - - # and a few controls - text = wx.StaticText(panel, -1, "Hello World!") - text.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD)) - text.SetSize(text.GetBestSize()) - btn = wx.Button(panel, -1, "Close") - funbtn = wx.Button(panel, -1, "Just for fun...") - - # bind the button events to handlers - self.Bind(wx.EVT_BUTTON, self.OnTimeToClose, btn) - self.Bind(wx.EVT_BUTTON, self.OnFunButton, funbtn) - - # Use a sizer to layout the controls, stacked vertically and with - # a 10 pixel border around each - sizer = wx.BoxSizer(wx.VERTICAL) - sizer.Add(text, 0, wx.ALL, 10) - sizer.Add(btn, 0, wx.ALL, 10) - sizer.Add(funbtn, 0, wx.ALL, 10) - panel.SetSizer(sizer) - panel.Layout() - - - def OnTimeToClose(self, evt): - """Event handler for the button click.""" - print("See ya later!") - self.Close() - - def OnFunButton(self, evt): - """Event handler for the button click.""" - print("Having fun yet?") - - - class MyApp(wx.App): - def OnInit(self): - frame = MyFrame(None, "Simple wxPython App") - self.SetTopWindow(frame) - - print("Print statements go to this stdout window by default.") - - frame.Show(True) - return True - - - if __name__ == '__main__': - - app = wx.GetApp() - if app is None: - app = MyApp(redirect=False, clearSigInt=False) - else: - frame = MyFrame(None, "Simple wxPython App") - app.SetTopWindow(frame) - print("Print statements go to this stdout window by default.") - frame.Show(True) - + app = wx.GetApp() + if app is None: + app = MyApp(redirect=False, clearSigInt=False) + else: + frame = MyFrame(None, "Simple wxPython App") + app.SetTopWindow(frame) + print("Print statements go to this stdout window by default.") + frame.Show(True) + diff --git a/python/helpers/pydev/tests_python/_debugger_case18.py b/python/helpers/pydev/tests_python/_debugger_case18.py index 06948019611d..8b34eedcfc59 100644 --- a/python/helpers/pydev/tests_python/_debugger_case18.py +++ b/python/helpers/pydev/tests_python/_debugger_case18.py @@ -1,4 +1,4 @@ - +import sys def m2(a): a = 10 @@ -6,7 +6,7 @@ def m2(a): c = 30 def function2(): - print(a) + print a return a diff --git a/python/helpers/pydev/tests_python/_debugger_case19.py b/python/helpers/pydev/tests_python/_debugger_case19.py index 07ac951f05e0..aaf380c8a3f5 100644 --- a/python/helpers/pydev/tests_python/_debugger_case19.py +++ b/python/helpers/pydev/tests_python/_debugger_case19.py @@ -5,6 +5,6 @@ class A: if __name__ == '__main__': a = A() - print(a._A__var) + print a._A__var # Evaluate 'a.__var' should give a._A__var_ print('TEST SUCEEDED') diff --git a/python/helpers/pydev/tests_python/_debugger_case7.py b/python/helpers/pydev/tests_python/_debugger_case7.py index 499d8d76e650..263110b1e990 100644 --- a/python/helpers/pydev/tests_python/_debugger_case7.py +++ b/python/helpers/pydev/tests_python/_debugger_case7.py @@ -5,4 +5,4 @@ def Call(): if __name__ == '__main__': Call() - print('TEST SUCEEDED!') + print 'TEST SUCEEDED!' diff --git a/python/helpers/pydev/tests_python/_debugger_case89.py b/python/helpers/pydev/tests_python/_debugger_case89.py index e22361d5a38d..e6f32dd522bb 100644 --- a/python/helpers/pydev/tests_python/_debugger_case89.py +++ b/python/helpers/pydev/tests_python/_debugger_case89.py @@ -1,16 +1,16 @@ def Method1(): - print('m1') + print 'm1' def Method2(): - print('m2 before') + print 'm2 before' Method1() - print('m2 after') + print 'm2 after' def Method3(): - print('m3 before') + print 'm3 before' Method2() - print('m3 after') + print 'm3 after' if __name__ == '__main__': Method3() - print('TEST SUCEEDED!') + print 'TEST SUCEEDED!' diff --git a/python/helpers/pydev/tests_python/test_additional_thread_info.py b/python/helpers/pydev/tests_python/test_additional_thread_info.py index 71dc35243257..6ae260d6a658 100644 --- a/python/helpers/pydev/tests_python/test_additional_thread_info.py +++ b/python/helpers/pydev/tests_python/test_additional_thread_info.py @@ -1,21 +1,10 @@ import sys import os -import pydev_monkey sys.path.insert(0, os.path.split(os.path.split(__file__)[0])[0]) from pydevd_constants import Null import unittest -try: - import thread -except: - import _thread as thread - -try: - xrange -except: - xrange = range - #======================================================================================================================= # TestCase #======================================================================================================================= @@ -51,7 +40,10 @@ class TestCase(unittest.TestCase): def testStartNewThread(self): - pydev_monkey.patch_thread_modules() + import pydevd + import thread + original = thread.start_new_thread + thread.start_new_thread = pydevd.pydev_start_new_thread try: found = {} def function(a, b, *args, **kwargs): @@ -70,11 +62,15 @@ class TestCase(unittest.TestCase): self.assertEqual({'a': 1, 'b': 2, 'args': (3, 4), 'kwargs': {'e': 2, 'd': 1}}, found) finally: - pydev_monkey.undo_patch_thread_modules() + thread.start_new_thread = original def testStartNewThread2(self): - pydev_monkey.patch_thread_modules() + import pydevd + import thread + + original = thread.start_new_thread + thread.start_new_thread = pydevd.pydev_start_new_thread try: found = {} @@ -105,7 +101,7 @@ class TestCase(unittest.TestCase): self.assertEqual({'a': 1, 'b': 2, 'args': (3, 4), 'kwargs': {'e': 2, 'd': 1}}, found) finally: - pydev_monkey.undo_patch_thread_modules() + thread.start_new_thread = original #======================================================================================================================= diff --git a/python/helpers/pydev/tests_python/test_debugger.py b/python/helpers/pydev/tests_python/test_debugger.py index ea569ddce556..fe1fa74a3a6e 100644 --- a/python/helpers/pydev/tests_python/test_debugger.py +++ b/python/helpers/pydev/tests_python/test_debugger.py @@ -5,18 +5,6 @@ Note that it's a python script but it'll spawn a process to run as jython, ironpython and as python. ''' -SHOW_WRITES_AND_READS = False -SHOW_OTHER_DEBUG_INFO = False -SHOW_STDOUT = False - - - -from pydevd_constants import IS_PY3K -try: - from thread import start_new_thread -except: - from _thread import start_new_thread -CMD_SET_PROPERTY_TRACE, CMD_EVALUATE_CONSOLE_EXPRESSION, CMD_RUN_CUSTOM_OPERATION, CMD_ENABLE_DONT_TRACE = 133, 134, 135, 141 PYTHON_EXE = None IRONPYTHON_EXE = None JYTHON_JAR_LOCATION = None @@ -25,13 +13,9 @@ JAVA_LOCATION = None import unittest import pydev_localhost +import re port = None -try: - xrange -except: - xrange = range - def UpdatePort(): global port s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -40,26 +24,29 @@ def UpdatePort(): s.close() import os -def _get_debugger_test_file(filename): +def NormFile(filename): try: - rPath = os.path.realpath # @UndefinedVariable + rPath = os.path.realpath #@UndefinedVariable except: # jython does not support os.path.realpath # realpath is a no-op on systems without islink support rPath = os.path.abspath - - return os.path.normcase(rPath(os.path.join(os.path.dirname(__file__), filename))) - -import pydevd -PYDEVD_FILE = pydevd.__file__ + return os.path.normcase(rPath(filename)) +PYDEVD_FILE = NormFile('../pydevd.py') import sys +sys.path.append(os.path.dirname(PYDEVD_FILE)) + +SHOW_WRITES_AND_READS = False +SHOW_RESULT_STR = False +SHOW_OTHER_DEBUG_INFO = False + import subprocess import socket import threading import time -from pydev_imports import quote_plus, quote, unquote_plus +from urllib import quote_plus, quote #======================================================================================================================= @@ -71,16 +58,13 @@ class ReaderThread(threading.Thread): threading.Thread.__init__(self) self.setDaemon(True) self.sock = sock - self.lastReceived = '' + self.lastReceived = None def run(self): - last_printed = None try: buf = '' while True: l = self.sock.recv(1024) - if IS_PY3K: - l = l.decode('utf-8') buf += l if '\n' in buf: @@ -88,11 +72,9 @@ class ReaderThread(threading.Thread): buf = '' if SHOW_WRITES_AND_READS: - if last_printed != self.lastReceived.strip(): - last_printed = self.lastReceived.strip() - print('Test Reader Thread Received %s' % last_printed) + print 'Test Reader Thread Received %s' % self.lastReceived.strip() except: - pass # ok, finished it + pass #ok, finished it def DoKill(self): self.sock.close() @@ -107,24 +89,18 @@ class AbstractWriterThread(threading.Thread): self.setDaemon(True) self.finishedOk = False self._next_breakpoint_id = 0 - self.log = [] - def DoKill(self): if hasattr(self, 'readerThread'): - # if it's not created, it's not there... + #if it's not created, it's not there... self.readerThread.DoKill() self.sock.close() def Write(self, s): - last = self.readerThread.lastReceived if SHOW_WRITES_AND_READS: - print('Test Writer Thread Written %s' % (s,)) - msg = s + '\n' - if IS_PY3K: - msg = msg.encode('utf-8') - self.sock.send(msg) + print 'Test Writer Thread Written %s' % (s,) + self.sock.send(s + '\n') time.sleep(0.2) i = 0 @@ -135,25 +111,24 @@ class AbstractWriterThread(threading.Thread): def StartSocket(self): if SHOW_WRITES_AND_READS: - print('StartSocket') + print 'StartSocket' s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('', port)) s.listen(1) if SHOW_WRITES_AND_READS: - print('Waiting in socket.accept()') + print 'Waiting in socket.accept()' newSock, addr = s.accept() if SHOW_WRITES_AND_READS: - print('Test Writer Thread Socket:', newSock, addr) + print 'Test Writer Thread Socket:', newSock, addr readerThread = self.readerThread = ReaderThread(newSock) readerThread.start() self.sock = newSock self._sequence = -1 - # initial command is always the version + #initial command is always the version self.WriteVersion() - self.log.append('StartSocket') def NextBreakpointId(self): self._next_breakpoint_id += 1 @@ -166,14 +141,14 @@ class AbstractWriterThread(threading.Thread): def WaitForNewThread(self): i = 0 - # wait for hit breakpoint + #wait for hit breakpoint while not '= 15: raise AssertionError('After %s seconds, a thread was not created.' % i) - # we have something like + #we have something like splitted = self.readerThread.lastReceived.split('"') threadId = splitted[3] return threadId @@ -184,32 +159,27 @@ class AbstractWriterThread(threading.Thread): 109 is return 111 is breakpoint ''' - self.log.append('Start: WaitForBreakpointHit') i = 0 - # wait for hit breakpoint - last = self.readerThread.lastReceived - while not ('stop_reason="%s"' % reason) in last: + #wait for hit breakpoint + while not ('stop_reason="%s"' % reason) in self.readerThread.lastReceived: i += 1 time.sleep(1) - last = self.readerThread.lastReceived if i >= 10: raise AssertionError('After %s seconds, a break with reason: %s was not hit. Found: %s' % \ - (i, reason, last)) + (i, reason, self.readerThread.lastReceived)) - # we have something like = 10: + raise AssertionError('After %s seconds, the expected evaluation was not found. Last found:\n%s' % + (i, self.readerThread.lastReceived)) + return True def WaitForVars(self, expected): i = 0 - # wait for hit breakpoint + #wait for hit breakpoint while not expected in self.readerThread.lastReceived: i += 1 time.sleep(1) @@ -237,49 +215,35 @@ class AbstractWriterThread(threading.Thread): return True def WaitForVar(self, expected): - self._WaitFor(expected, 'the var was not found') - - def _WaitFor(self, expected, error_msg): - ''' - :param expected: - If a list we'll work with any of the choices. - ''' - if not isinstance(expected, (list, tuple)): - expected = [expected] - i = 0 - found = False - while not found: - last = self.readerThread.lastReceived - for e in expected: - if e in last: - found = True - break - - last = unquote_plus(last) - for e in expected: - if e in last: - found = True - break - - if found: - break - + while not expected in self.readerThread.lastReceived: i += 1 time.sleep(1) if i >= 10: - raise AssertionError('After %s seconds, %s. Last found:\n%s' % - (i, error_msg, last)) + raise AssertionError('After %s seconds, the var was not found. Last found:\n%s' % + (i, self.readerThread.lastReceived)) + + return True + + def WaitForVarRE(self, expected_regular_expression): + i = 0 + pattern = re.compile(expected_regular_expression) + while not pattern.search(self.readerThread.lastReceived): + i += 1 + time.sleep(1) + if i >= 10: + raise AssertionError('After %s seconds, the var (using RE) was not found. Last found:\n%s' % + (i, self.readerThread.lastReceived)) return True def WaitForMultipleVars(self, expected_vars): i = 0 - # wait for hit breakpoint + #wait for hit breakpoint while True: for expected in expected_vars: if expected not in self.readerThread.lastReceived: - break # Break out of loop (and don't get to else) + break #Break out of loop (and don't get to else) else: return True @@ -293,29 +257,29 @@ class AbstractWriterThread(threading.Thread): def WriteMakeInitialRun(self): self.Write("101\t%s\t" % self.NextSeq()) - self.log.append('WriteMakeInitialRun') def WriteVersion(self): - self.Write("501\t%s\t1.0\tWINDOWS\tID" % self.NextSeq()) + self.Write("501\t%s\t1.0" % self.NextSeq()) def WriteAddBreakpoint(self, line, func): ''' @param line: starts at 1 ''' breakpoint_id = self.NextBreakpointId() - self.Write("111\t%s\t%s\t%s\t%s\t%s\t%s\tNone\tNone" % (self.NextSeq(), breakpoint_id, 'python-line', self.TEST_FILE, line, func)) - self.log.append('WriteAddBreakpoint: %s line: %s func: %s' % (breakpoint_id, line, func)) + if func is not None: + self.Write("111\t%s\t%s\t%s\t%s\t**FUNC**%s\tNone" % (self.NextSeq(), breakpoint_id, self.TEST_FILE, line, func)) + else: + self.Write("111\t%s\t%s\t%s\t%s\tNone" % (self.NextSeq(), breakpoint_id, self.TEST_FILE, line)) return breakpoint_id def WriteRemoveBreakpoint(self, breakpoint_id): - self.Write("112\t%s\t%s\t%s\t%s" % (self.NextSeq(), 'python-line', self.TEST_FILE, breakpoint_id)) + self.Write("112\t%s\t%s\t%s" % (self.NextSeq(), breakpoint_id, self.TEST_FILE)) def WriteChangeVariable(self, thread_id, frame_id, varname, value): self.Write("117\t%s\t%s\t%s\t%s\t%s\t%s" % (self.NextSeq(), thread_id, frame_id, 'FRAME', varname, value)) def WriteGetFrame(self, threadId, frameId): self.Write("114\t%s\t%s\t%s\tFRAME" % (self.NextSeq(), threadId, frameId)) - self.log.append('WriteGetFrame') def WriteGetVariable(self, threadId, frameId, var_attrs): self.Write("110\t%s\t%s\t%s\tFRAME\t%s" % (self.NextSeq(), threadId, frameId, var_attrs)) @@ -333,27 +297,26 @@ class AbstractWriterThread(threading.Thread): self.Write("105\t%s\t%s" % (self.NextSeq(), threadId,)) def WriteRunThread(self, threadId): - self.log.append('WriteRunThread') self.Write("106\t%s\t%s" % (self.NextSeq(), threadId,)) def WriteKillThread(self, threadId): self.Write("104\t%s\t%s" % (self.NextSeq(), threadId,)) def WriteDebugConsoleExpression(self, locator): - self.Write("%s\t%s\t%s" % (CMD_EVALUATE_CONSOLE_EXPRESSION, self.NextSeq(), locator)) + self.Write("126\t%s\t%s" % (self.NextSeq(), locator)) def WriteCustomOperation(self, locator, style, codeOrFile, operation_fn_name): - self.Write("%s\t%s\t%s||%s\t%s\t%s" % (CMD_RUN_CUSTOM_OPERATION, self.NextSeq(), locator, style, codeOrFile, operation_fn_name)) + self.Write("127\t%s\t%s||%s\t%s\t%s" % (self.NextSeq(), locator, style, codeOrFile, operation_fn_name)) def WriteEvaluateExpression(self, locator, expression): - self.Write("113\t%s\t%s\t%s\t1" % (self.NextSeq(), locator, expression)) + self.Write("113\t%s\t%s\t%s" % (self.NextSeq(), locator, expression)) def WriteEnableDontTrace(self, enable): if enable: enable = 'true' else: enable = 'false' - self.Write("%s\t%s\t%s" % (CMD_ENABLE_DONT_TRACE, self.NextSeq(), enable)) + self.Write("133\t%s\t%s" % (self.NextSeq(), enable)) #======================================================================================================================= @@ -361,7 +324,7 @@ class AbstractWriterThread(threading.Thread): #====================================================================================================================== class WriterThreadCase19(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case19.py') + TEST_FILE = NormFile('_debugger_case19.py') def run(self): self.StartSocket() @@ -385,7 +348,7 @@ class WriterThreadCase19(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase18(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case18.py') + TEST_FILE = NormFile('_debugger_case18.py') def run(self): self.StartSocket() @@ -405,7 +368,7 @@ class WriterThreadCase18(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase17(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case17.py') + TEST_FILE = NormFile('_debugger_case17.py') def run(self): self.StartSocket() @@ -433,7 +396,7 @@ class WriterThreadCase17(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase16(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case16.py') + TEST_FILE = NormFile('_debugger_case16.py') def run(self): self.StartSocket() @@ -453,48 +416,34 @@ class WriterThreadCase16(AbstractWriterThread): # For each variable, check each of the resolved (meta data) attributes... self.WriteGetVariable(threadId, frameId, 'smallarray') - self.WaitForVar('') + self.WaitForVar('') + self.WaitForVar('') + self.WaitForVar('') + self.WaitForVar('') # ...and check that the internals are resolved properly self.WriteGetVariable(threadId, frameId, 'smallarray\t__internals__') - self.WaitForVar('') self.WriteGetVariable(threadId, frameId, 'bigarray') - self.WaitForVar([ - '', - '', - '', - ]) - self.WaitForVar([ - '', - '', - '') #TODO: When on a 32 bit python we get an int32 (which makes this test fail). + self.WaitForVar('') + self.WaitForVar('') + self.WaitForVar('') + self.WaitForVar('') self.WriteGetVariable(threadId, frameId, 'bigarray\t__internals__') - self.WaitForVar('') # this one is different because it crosses the magic threshold where we don't calculate # the min/max self.WriteGetVariable(threadId, frameId, 'hugearray') - self.WaitForVar([ - '', - '', - ]) - self.WaitForVar([ - '', - '', - ]) - self.WaitForVar('') + self.WaitForVar('') + self.WaitForVar('') + self.WaitForVar('') + self.WaitForVar('') self.WriteGetVariable(threadId, frameId, 'hugearray\t__internals__') - self.WaitForVar('') self.WriteRunThread(threadId) self.finishedOk = True @@ -505,7 +454,7 @@ class WriterThreadCase16(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase15(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case15.py') + TEST_FILE = NormFile('_debugger_case15.py') def run(self): self.StartSocket() @@ -519,7 +468,7 @@ class WriterThreadCase15(AbstractWriterThread): self.WaitForCustomOperation('val=Black') assert 7 == self._sequence, 'Expected 7. Had: %s' % self._sequence - self.WriteCustomOperation("%s\t%s\tEXPRESSION\tcarObj.color" % (threadId, frameId), "EXECFILE", _get_debugger_test_file('_debugger_case15_execfile.py'), "f") + self.WriteCustomOperation("%s\t%s\tEXPRESSION\tcarObj.color" % (threadId, frameId), "EXECFILE", NormFile('_debugger_case15_execfile.py'), "f") self.WaitForCustomOperation('val=Black') assert 9 == self._sequence, 'Expected 9. Had: %s' % self._sequence @@ -533,7 +482,7 @@ class WriterThreadCase15(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase14(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case14.py') + TEST_FILE = NormFile('_debugger_case14.py') def run(self): self.StartSocket() @@ -541,31 +490,24 @@ class WriterThreadCase14(AbstractWriterThread): self.WriteMakeInitialRun() threadId, frameId, line = self.WaitForBreakpointHit('111', True) - assert threadId, '%s not valid.' % threadId - assert frameId, '%s not valid.' % frameId # Access some variable self.WriteDebugConsoleExpression("%s\t%s\tEVALUATE\tcarObj.color" % (threadId, frameId)) - self.WaitForVar(['False', '%27Black%27']) + self.WaitForMultipleVars(['False', '%27Black%27']) assert 7 == self._sequence, 'Expected 9. Had: %s' % self._sequence # Change some variable self.WriteDebugConsoleExpression("%s\t%s\tEVALUATE\tcarObj.color='Red'" % (threadId, frameId)) self.WriteDebugConsoleExpression("%s\t%s\tEVALUATE\tcarObj.color" % (threadId, frameId)) - self.WaitForVar(['False', '%27Red%27']) + self.WaitForMultipleVars(['False', '%27Red%27']) assert 11 == self._sequence, 'Expected 13. Had: %s' % self._sequence # Iterate some loop self.WriteDebugConsoleExpression("%s\t%s\tEVALUATE\tfor i in range(3):" % (threadId, frameId)) - self.WaitForVar(['True', '1']) - self.WriteDebugConsoleExpression("%s\t%s\tEVALUATE\t print(i)" % (threadId, frameId)) + self.WaitForVars('True') + self.WriteDebugConsoleExpression("%s\t%s\tEVALUATE\t print i" % (threadId, frameId)) self.WriteDebugConsoleExpression("%s\t%s\tEVALUATE\t" % (threadId, frameId)) - self.WaitForVar( - [ - 'False', - '0' - ] - ) + self.WaitForVars('False') assert 17 == self._sequence, 'Expected 19. Had: %s' % self._sequence self.WriteRunThread(threadId) @@ -577,12 +519,12 @@ class WriterThreadCase14(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase13(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case13.py') + TEST_FILE = NormFile('_debugger_case13.py') def run(self): self.StartSocket() self.WriteAddBreakpoint(35, 'main') - self.Write("%s\t%s\t%s" % (CMD_SET_PROPERTY_TRACE, self.NextSeq(), "true;false;false;true")) + self.Write("124\t%s\t%s" % (self.NextSeq(), "true;false;false;true")) self.WriteMakeInitialRun() threadId, frameId, line = self.WaitForBreakpointHit('111', True) @@ -605,14 +547,14 @@ class WriterThreadCase13(AbstractWriterThread): threadId, frameId, line = self.WaitForBreakpointHit('107', True) # Disable property tracing - self.Write("%s\t%s\t%s" % (CMD_SET_PROPERTY_TRACE, self.NextSeq(), "true;true;true;true")) + self.Write("124\t%s\t%s" % (self.NextSeq(), "true;true;true;true")) self.WriteStepIn(threadId) threadId, frameId, line = self.WaitForBreakpointHit('107', True) # Should Skip step into properties setter assert line == 39, 'Expected return to be in line 39, was: %s' % line # Enable property tracing - self.Write("%s\t%s\t%s" % (CMD_SET_PROPERTY_TRACE, self.NextSeq(), "true;false;false;true")) + self.Write("124\t%s\t%s" % (self.NextSeq(), "true;false;false;true")) self.WriteStepIn(threadId) threadId, frameId, line = self.WaitForBreakpointHit('107', True) # Should go inside getter method @@ -627,11 +569,11 @@ class WriterThreadCase13(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase12(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case10.py') + TEST_FILE = NormFile('_debugger_case10.py') def run(self): self.StartSocket() - self.WriteAddBreakpoint(2, '') # Should not be hit: setting empty function (not None) should only hit global. + self.WriteAddBreakpoint(2, '') #Should not be hit: setting empty function (not None) should only hit global. self.WriteAddBreakpoint(6, 'Method1a') self.WriteAddBreakpoint(11, 'Method2') self.WriteMakeInitialRun() @@ -642,7 +584,7 @@ class WriterThreadCase12(AbstractWriterThread): self.WriteStepReturn(threadId) - threadId, frameId, line = self.WaitForBreakpointHit('111', True) # not a return (it stopped in the other breakpoint) + threadId, frameId, line = self.WaitForBreakpointHit('111', True) #not a return (it stopped in the other breakpoint) assert line == 6, 'Expected return to be in line 6, was: %s' % line @@ -659,7 +601,7 @@ class WriterThreadCase12(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase11(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case10.py') + TEST_FILE = NormFile('_debugger_case10.py') def run(self): self.StartSocket() @@ -700,11 +642,11 @@ class WriterThreadCase11(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase10(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case10.py') + TEST_FILE = NormFile('_debugger_case10.py') def run(self): self.StartSocket() - self.WriteAddBreakpoint(2, 'None') # None or Method should make hit. + self.WriteAddBreakpoint(2, 'None') #None or Method should make hit. self.WriteMakeInitialRun() threadId, frameId = self.WaitForBreakpointHit('111') @@ -734,7 +676,7 @@ class WriterThreadCase10(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase9(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case89.py') + TEST_FILE = NormFile('_debugger_case89.py') def run(self): self.StartSocket() @@ -767,7 +709,7 @@ class WriterThreadCase9(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase8(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case89.py') + TEST_FILE = NormFile('_debugger_case89.py') def run(self): self.StartSocket() @@ -796,7 +738,7 @@ class WriterThreadCase8(AbstractWriterThread): #====================================================================================================================== class WriterThreadCase7(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case7.py') + TEST_FILE = NormFile('_debugger_case7.py') def run(self): self.StartSocket() @@ -807,7 +749,7 @@ class WriterThreadCase7(AbstractWriterThread): self.WriteGetFrame(threadId, frameId) - self.WaitForVars('') # no vars at this point + self.WaitForVars('') #no vars at this point self.WriteStepOver(threadId) @@ -834,7 +776,7 @@ class WriterThreadCase7(AbstractWriterThread): #======================================================================================================================= class WriterThreadCase6(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case56.py') + TEST_FILE = NormFile('_debugger_case56.py') def run(self): self.StartSocket() @@ -855,7 +797,7 @@ class WriterThreadCase6(AbstractWriterThread): threadId, frameId, line = self.WaitForBreakpointHit('107', True) - # goes to line 4 in jython (function declaration line) + #goes to line 4 in jython (function declaration line) assert line in (4, 5), 'Expecting it to go to line 4 or 5. Went to: %s' % line self.WriteRunThread(threadId) @@ -869,7 +811,7 @@ class WriterThreadCase6(AbstractWriterThread): #======================================================================================================================= class WriterThreadCase5(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case56.py') + TEST_FILE = NormFile('_debugger_case56.py') def run(self): self.StartSocket() @@ -892,7 +834,7 @@ class WriterThreadCase5(AbstractWriterThread): threadId, frameId, line = self.WaitForBreakpointHit('107', True) - # goes to line 4 in jython (function declaration line) + #goes to line 4 in jython (function declaration line) assert line in (4, 5), 'Expecting it to go to line 4 or 5. Went to: %s' % line self.WriteRunThread(threadId) @@ -907,7 +849,7 @@ class WriterThreadCase5(AbstractWriterThread): #======================================================================================================================= class WriterThreadCase4(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case4.py') + TEST_FILE = NormFile('_debugger_case4.py') def run(self): self.StartSocket() @@ -917,7 +859,7 @@ class WriterThreadCase4(AbstractWriterThread): self.WriteSuspendThread(threadId) - time.sleep(4) # wait for time enough for the test to finish if it wasn't suspended + time.sleep(4) #wait for time enough for the test to finish if it wasn't suspended self.WriteRunThread(threadId) @@ -929,14 +871,14 @@ class WriterThreadCase4(AbstractWriterThread): #======================================================================================================================= class WriterThreadCase3(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case3.py') + TEST_FILE = NormFile('_debugger_case3.py') def run(self): self.StartSocket() self.WriteMakeInitialRun() - time.sleep(.5) + time.sleep(1) breakpoint_id = self.WriteAddBreakpoint(4, '') - self.WriteAddBreakpoint(5, 'FuncNotAvailable') # Check that it doesn't get hit in the global when a function is available + self.WriteAddBreakpoint(5, 'FuncNotAvailable') #Check that it doesn't get hit in the global when a function is available threadId, frameId = self.WaitForBreakpointHit() @@ -961,11 +903,11 @@ class WriterThreadCase3(AbstractWriterThread): #======================================================================================================================= class WriterThreadCase2(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case2.py') + TEST_FILE = NormFile('_debugger_case2.py') def run(self): self.StartSocket() - self.WriteAddBreakpoint(3, 'Call4') # seq = 3 + self.WriteAddBreakpoint(3, 'Call4') #seq = 3 self.WriteMakeInitialRun() threadId, frameId = self.WaitForBreakpointHit() @@ -982,79 +924,8 @@ class WriterThreadCase2(AbstractWriterThread): self.WriteRunThread(threadId) - self.log.append('Checking sequence. Found: %s' % (self._sequence)) assert 15 == self._sequence, 'Expected 15. Had: %s' % self._sequence - self.log.append('Marking finished ok.') - self.finishedOk = True - -#======================================================================================================================= -# WriterThreadCaseQThread1 -#======================================================================================================================= -class WriterThreadCaseQThread1(AbstractWriterThread): - - TEST_FILE = _get_debugger_test_file('_debugger_case_qthread1.py') - - def run(self): - self.StartSocket() - breakpoint_id = self.WriteAddBreakpoint(16, 'run') - self.WriteMakeInitialRun() - - threadId, frameId = self.WaitForBreakpointHit() - - self.WriteRemoveBreakpoint(breakpoint_id) - self.WriteRunThread(threadId) - - self.log.append('Checking sequence. Found: %s' % (self._sequence)) - assert 9 == self._sequence, 'Expected 9. Had: %s' % self._sequence - - self.log.append('Marking finished ok.') - self.finishedOk = True - -#======================================================================================================================= -# WriterThreadCaseQThread2 -#======================================================================================================================= -class WriterThreadCaseQThread2(AbstractWriterThread): - - TEST_FILE = _get_debugger_test_file('_debugger_case_qthread2.py') - - def run(self): - self.StartSocket() - breakpoint_id = self.WriteAddBreakpoint(18, 'longRunning') - self.WriteMakeInitialRun() - - threadId, frameId = self.WaitForBreakpointHit() - - self.WriteRemoveBreakpoint(breakpoint_id) - self.WriteRunThread(threadId) - - self.log.append('Checking sequence. Found: %s' % (self._sequence)) - assert 9 == self._sequence, 'Expected 9. Had: %s' % self._sequence - - self.log.append('Marking finished ok.') - self.finishedOk = True - -#======================================================================================================================= -# WriterThreadCaseQThread3 -#======================================================================================================================= -class WriterThreadCaseQThread3(AbstractWriterThread): - - TEST_FILE = _get_debugger_test_file('_debugger_case_qthread3.py') - - def run(self): - self.StartSocket() - breakpoint_id = self.WriteAddBreakpoint(19, 'run') - self.WriteMakeInitialRun() - - threadId, frameId = self.WaitForBreakpointHit() - - self.WriteRemoveBreakpoint(breakpoint_id) - self.WriteRunThread(threadId) - - self.log.append('Checking sequence. Found: %s' % (self._sequence)) - assert 9 == self._sequence, 'Expected 9. Had: %s' % self._sequence - - self.log.append('Marking finished ok.') self.finishedOk = True #======================================================================================================================= @@ -1062,39 +933,24 @@ class WriterThreadCaseQThread3(AbstractWriterThread): #======================================================================================================================= class WriterThreadCase1(AbstractWriterThread): - TEST_FILE = _get_debugger_test_file('_debugger_case1.py') + TEST_FILE = NormFile('_debugger_case1.py') def run(self): self.StartSocket() - - self.log.append('writing add breakpoint') self.WriteAddBreakpoint(6, 'SetUp') - - self.log.append('making initial run') self.WriteMakeInitialRun() - self.log.append('waiting for breakpoint hit') threadId, frameId = self.WaitForBreakpointHit() - self.log.append('get frame') self.WriteGetFrame(threadId, frameId) - self.log.append('step over') self.WriteStepOver(threadId) - self.log.append('get frame') self.WriteGetFrame(threadId, frameId) - self.log.append('run thread') self.WriteRunThread(threadId) - self.log.append('asserting') - try: - assert 13 == self._sequence, 'Expected 13. Had: %s' % self._sequence - except: - self.log.append('assert failed!') - raise - self.log.append('asserted') + assert 13 == self._sequence, 'Expected 13. Had: %s' % self._sequence self.finishedOk = True @@ -1110,7 +966,6 @@ class DebuggerBase(object): UpdatePort() writerThread = writerThreadClass() writerThread.start() - time.sleep(1) localhost = pydev_localhost.get_localhost() args = self.getCommandLine() @@ -1126,74 +981,59 @@ class DebuggerBase(object): ] if SHOW_OTHER_DEBUG_INFO: - print('executing', ' '.join(args)) + print 'executing', ' '.join(args) process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=os.path.dirname(PYDEVD_FILE)) + class ProcessReadThread(threading.Thread): + def run(self): + self.resultStr = None + self.resultStr = process.stdout.read() + process.stdout.close() - stdout = [] - stderr = [] + def DoKill(self): + process.stdout.close() - def read(stream, buffer): - for line in stream.readlines(): - if IS_PY3K: - line = line.decode('utf-8') - - if SHOW_STDOUT: - print(line) - buffer.append(line) - - start_new_thread(read, (process.stdout, stdout)) - - + processReadThread = ProcessReadThread() + processReadThread.setDaemon(True) + processReadThread.start() if SHOW_OTHER_DEBUG_INFO: - print('Both processes started') + print 'Both processes started' - # polls can fail (because the process may finish and the thread still not -- so, we give it some more chances to - # finish successfully). - check = 0 - while True: + #polls can fail (because the process may finish and the thread still not -- so, we give it some more chances to + #finish successfully). + pools_failed = 0 + while writerThread.isAlive(): if process.poll() is not None: - break - else: - if not writerThread.isAlive(): - check += 1 - if check == 20: - print('Warning: writer thread exited and process still did not.') - if check == 100: - self.fail_with_message( - "The other process should've exited but still didn't (timeout for process to exit).", - stdout, stderr, writerThread - ) + pools_failed += 1 time.sleep(.2) - - - poll = process.poll() - if poll < 0: - self.fail_with_message( - "The other process exited with error code: " + str(poll), stdout, stderr, writerThread) + if pools_failed == 10: + break + + if process.poll() is None: + for i in range(10): + if processReadThread.resultStr is None: + time.sleep(.5) + else: + break + else: + writerThread.DoKill() + + else: + if process.poll() < 0: + self.fail("The other process exited with error code: " + str(process.poll()) + " result:" + processReadThread.resultStr) - if stdout is None: - self.fail_with_message( - "The other process may still be running -- and didn't give any output.", stdout, stderr, writerThread) + if SHOW_RESULT_STR: + print processReadThread.resultStr - if 'TEST SUCEEDED' not in ''.join(stdout): - self.fail_with_message("TEST SUCEEDED not found in stdout.", stdout, stderr, writerThread) + if processReadThread.resultStr is None: + self.fail("The other process may still be running -- and didn't give any output") + + if 'TEST SUCEEDED' not in processReadThread.resultStr: + self.fail(processReadThread.resultStr) - for i in xrange(100): - if not writerThread.finishedOk: - time.sleep(.1) - if not writerThread.finishedOk: - self.fail_with_message( - "The thread that was doing the tests didn't finish successfully.", stdout, stderr, writerThread) - - def fail_with_message(self, msg, stdout, stderr, writerThread): - self.fail(msg+ - "\nStdout: \n"+'\n'.join(stdout)+ - "\nStderr:"+'\n'.join(stderr)+ - "\nLog:\n"+'\n'.join(getattr(writerThread, 'log', []))) - + self.fail("The thread that was doing the tests didn't finish successfully. Output: %s" % processReadThread.resultStr) def testCase1(self): self.CheckCase(WriterThreadCase1) @@ -1251,30 +1091,6 @@ class DebuggerBase(object): def testCase19(self): self.CheckCase(WriterThreadCase19) - - def _has_qt(self): - try: - from PySide import QtCore - return True - except: - try: - from PyQt4 import QtCore - return True - except: - pass - return False - - def testCaseQthread1(self): - if self._has_qt(): - self.CheckCase(WriterThreadCaseQThread1) - - def testCaseQthread2(self): - if self._has_qt(): - self.CheckCase(WriterThreadCaseQThread2) - - def testCaseQthread3(self): - if self._has_qt(): - self.CheckCase(WriterThreadCaseQThread3) class TestPython(unittest.TestCase, DebuggerBase): @@ -1290,20 +1106,20 @@ class TestJython(unittest.TestCase, DebuggerBase): 'org.python.util.jython' ] - # This case requires decorators to work (which are not present on Jython 2.1), so, this test is just removed from the jython run. + #This case requires decorators to work (which are not present on Jython 2.1), so, this test is just removed from the jython run. def testCase13(self): self.skipTest("Unsupported Decorators") - # This case requires decorators to work (which are not present on Jython 2.1), so, this test is just removed from the jython run. + def testCase16(self): + self.skipTest("Unsupported numpy") + + #This case requires decorators to work (which are not present on Jython 2.1), so, this test is just removed from the jython run. def testCase17(self): self.skipTest("Unsupported Decorators") def testCase18(self): self.skipTest("Unsupported assign to local") - def testCase16(self): - self.skipTest("Unsupported numpy") - class TestIronPython(unittest.TestCase, DebuggerBase): def getCommandLine(self): return [ @@ -1311,22 +1127,8 @@ class TestIronPython(unittest.TestCase, DebuggerBase): '-X:Frames' ] - def testCase3(self): - self.skipTest("Timing issues") # This test fails once in a while due to timing issues on IronPython, so, skipping it. - - def testCase7(self): - # This test checks that we start without variables and at each step a new var is created, but on ironpython, - # the variables exist all at once (with None values), so, we can't test it properly. - self.skipTest("Different behavior on IronPython") - - def testCase13(self): - self.skipTest("Unsupported Decorators") # Not sure why it doesn't work on IronPython, but it's not so common, so, leave it be. - def testCase16(self): self.skipTest("Unsupported numpy") - - def testCase18(self): - self.skipTest("Unsupported assign to local") def GetLocationFromLine(line): @@ -1348,90 +1150,44 @@ def SplitLine(line): - import platform sysname = platform.system().lower() test_dependent = os.path.join('../../../', 'org.python.pydev.core', 'tests', 'org', 'python', 'pydev', 'core', 'TestDependent.' + sysname + '.properties') +f = open(test_dependent) +try: + for line in f.readlines(): + var, loc = SplitLine(line) + if 'PYTHON_EXE' == var: + PYTHON_EXE = loc -if os.path.exists(test_dependent): - f = open(test_dependent) - try: - for line in f.readlines(): - var, loc = SplitLine(line) - if 'PYTHON_EXE' == var: - PYTHON_EXE = loc - - if 'IRONPYTHON_EXE' == var: - IRONPYTHON_EXE = loc - - if 'JYTHON_JAR_LOCATION' == var: - JYTHON_JAR_LOCATION = loc - - if 'JAVA_LOCATION' == var: - JAVA_LOCATION = loc - finally: - f.close() -else: - pass + if 'IRONPYTHON_EXE' == var: + IRONPYTHON_EXE = loc -if IRONPYTHON_EXE is None: - sys.stderr.write('Warning: not running IronPython tests.\n') - class TestIronPython(unittest.TestCase): - pass + if 'JYTHON_JAR_LOCATION' == var: + JYTHON_JAR_LOCATION = loc + + if 'JAVA_LOCATION' == var: + JAVA_LOCATION = loc +finally: + f.close() + +assert PYTHON_EXE, 'PYTHON_EXE not found in %s' % (test_dependent,) +assert IRONPYTHON_EXE, 'IRONPYTHON_EXE not found in %s' % (test_dependent,) +assert JYTHON_JAR_LOCATION, 'JYTHON_JAR_LOCATION not found in %s' % (test_dependent,) +assert JAVA_LOCATION, 'JAVA_LOCATION not found in %s' % (test_dependent,) +assert os.path.exists(PYTHON_EXE), 'The location: %s is not valid' % (PYTHON_EXE,) +assert os.path.exists(IRONPYTHON_EXE), 'The location: %s is not valid' % (IRONPYTHON_EXE,) +assert os.path.exists(JYTHON_JAR_LOCATION), 'The location: %s is not valid' % (JYTHON_JAR_LOCATION,) +assert os.path.exists(JAVA_LOCATION), 'The location: %s is not valid' % (JAVA_LOCATION,) + +if False: + suite = unittest.TestSuite() + suite.addTest(TestPython('testCase19')) + #suite.addTest(Test('testCase10a')) + unittest.TextTestRunner(verbosity=3).run(suite) -if JAVA_LOCATION is None: - sys.stderr.write('Warning: not running Jython tests.\n') - class TestJython(unittest.TestCase): - pass - -# if PYTHON_EXE is None: -PYTHON_EXE = sys.executable - - -if __name__ == '__main__': - if False: - assert PYTHON_EXE, 'PYTHON_EXE not found in %s' % (test_dependent,) - assert IRONPYTHON_EXE, 'IRONPYTHON_EXE not found in %s' % (test_dependent,) - assert JYTHON_JAR_LOCATION, 'JYTHON_JAR_LOCATION not found in %s' % (test_dependent,) - assert JAVA_LOCATION, 'JAVA_LOCATION not found in %s' % (test_dependent,) - assert os.path.exists(PYTHON_EXE), 'The location: %s is not valid' % (PYTHON_EXE,) - assert os.path.exists(IRONPYTHON_EXE), 'The location: %s is not valid' % (IRONPYTHON_EXE,) - assert os.path.exists(JYTHON_JAR_LOCATION), 'The location: %s is not valid' % (JYTHON_JAR_LOCATION,) - assert os.path.exists(JAVA_LOCATION), 'The location: %s is not valid' % (JAVA_LOCATION,) - - if True: - #try: - # os.remove(r'X:\pydev\plugins\org.python.pydev\pysrc\pydevd.pyc') - #except: - # pass - suite = unittest.TestSuite() - -# suite.addTests(unittest.makeSuite(TestJython)) # Note: Jython should be 2.2.1 -# -# suite.addTests(unittest.makeSuite(TestIronPython)) -# -# suite.addTests(unittest.makeSuite(TestPython)) - - - - -# suite.addTest(TestIronPython('testCase18')) -# suite.addTest(TestIronPython('testCase17')) -# suite.addTest(TestIronPython('testCase3')) -# suite.addTest(TestIronPython('testCase7')) -# - suite.addTest(TestPython('testCaseQthread1')) - suite.addTest(TestPython('testCaseQthread2')) - suite.addTest(TestPython('testCaseQthread3')) - -# suite.addTest(TestPython('testCase4')) - - -# suite.addTest(TestJython('testCase1')) -# suite.addTest(TestPython('testCase2')) -# unittest.TextTestRunner(verbosity=3).run(suite) - # suite.addTest(TestPython('testCase17')) - # suite.addTest(TestPython('testCase18')) - # suite.addTest(TestPython('testCase19')) - - unittest.TextTestRunner(verbosity=3).run(suite) +# suite = unittest.makeSuite(TestPython) +# unittest.TextTestRunner(verbosity=3).run(suite) +# +# suite = unittest.makeSuite(TestJython) +# unittest.TextTestRunner(verbosity=3).run(suite) diff --git a/python/helpers/pydev/tests_python/test_pydev_monkey.py b/python/helpers/pydev/tests_python/test_pydev_monkey.py index be1312a066d3..022efcbf39b1 100644 --- a/python/helpers/pydev/tests_python/test_pydev_monkey.py +++ b/python/helpers/pydev/tests_python/test_pydev_monkey.py @@ -1,32 +1,16 @@ import unittest import pydev_monkey import sys -from pydevd import SetupHolder -from pydev_monkey import pydev_src_dir - class TestCase(unittest.TestCase): def test_monkey(self): - original = SetupHolder.setup - - try: - SetupHolder.setup = {'client':'127.0.0.1', 'port': '0'} - check='''C:\\bin\\python.exe -u -c " + check='''C:\\bin\\python.exe -u -c " connect(\\"127.0.0.1\\") "''' - sys.original_argv = [] - self.assertEqual( - '"C:\\bin\\python.exe" "-u" "-c" "import sys; ' - 'sys.path.append(r\'%s\'); ' - 'import pydevd; pydevd.settrace(host=\'127.0.0.1\', port=0, suspend=False, ' - 'trace_only_current_thread=False, patch_multiprocessing=True); ' - '\nconnect(\\"127.0.0.1\\")\n"' % pydev_src_dir, - pydev_monkey.patch_arg_str_win(check) - ) - finally: - SetupHolder.setup = original + sys.original_argv = [] + self.assertEqual('"-u" "-c" "\nconnect(\\"127.0.0.1\\")\n"', pydev_monkey.patch_arg_str_win(check)) def test_str_to_args_windows(self): diff --git a/python/helpers/pydev/tests_python/test_save_locals.py b/python/helpers/pydev/tests_python/test_save_locals.py index a3beb567d305..fe65d4d438d1 100644 --- a/python/helpers/pydev/tests_python/test_save_locals.py +++ b/python/helpers/pydev/tests_python/test_save_locals.py @@ -16,7 +16,7 @@ def use_save_locals(name, value): save_locals(frame) -def check_method(fn): +def test_method(fn): """ A harness for testing methods that attempt to modify the values of locals on the stack. """ @@ -36,7 +36,7 @@ class TestSetLocals(unittest.TestCase): def test_set_locals_using_save_locals(self): - x = check_method(use_save_locals) + x = test_method(use_save_locals) self.assertEqual(x, 2) # Expected to succeed @@ -65,7 +65,7 @@ class TestSetLocals(unittest.TestCase): def check_co_vars(a): frame = sys._getframe() def function2(): - print(a) + print a assert 'a' in frame.f_code.co_cellvars frame = sys._getframe() diff --git a/python/helpers/pydev/tests_runfiles/test_runfiles.py b/python/helpers/pydev/tests_runfiles/test_runfiles.py index 2d381a39be5e..7ca6efe9e7fc 100644 --- a/python/helpers/pydev/tests_runfiles/test_runfiles.py +++ b/python/helpers/pydev/tests_runfiles/test_runfiles.py @@ -26,6 +26,7 @@ if 'pydev_runfiles' in sys.modules: import pydev_runfiles import unittest import tempfile +import re try: set @@ -191,7 +192,7 @@ class RunfilesTest(unittest.TestCase): files_with_tests = [1 for t in self.all_tests if len(t._tests) > 0] self.assertNotEquals(len(self.files), len(files_with_tests)) - def count_suite(self, tests=None): + def count_tests(self, tests): total = 0 for t in tests: total += t.countTestCases() @@ -207,60 +208,60 @@ class RunfilesTest(unittest.TestCase): def test_finding_tests_from_modules_with_bad_filter_returns_0_tests(self): self._setup_scenario(self.file_dir, ["NO_TESTS_ARE_SURE_TO_HAVE_THIS_NAME"]) - self.assertEquals(0, self.count_suite(self.all_tests)) + self.assertEquals(0, self.count_tests(self.all_tests)) def test_finding_test_with_unique_name_returns_1_test(self): self._setup_scenario(self.file_dir, include_tests=["test_i_am_a_unique_test_name"]) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEquals(1, self.count_suite(filtered_tests)) + self.assertEquals(1, self.count_tests(filtered_tests)) def test_finding_test_with_non_unique_name(self): self._setup_scenario(self.file_dir, include_tests=["test_non_unique_name"]) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEquals(1, self.count_suite(filtered_tests) > 2) + self.assertEquals(1, self.count_tests(filtered_tests) > 2) def test_finding_tests_with_regex_filters(self): self._setup_scenario(self.file_dir, include_tests=["test_non*"]) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEquals(1, self.count_suite(filtered_tests) > 2) + self.assertEquals(1, self.count_tests(filtered_tests) > 2) self._setup_scenario(self.file_dir, ["^$"]) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEquals(0, self.count_suite(filtered_tests)) + self.assertEquals(0, self.count_tests(filtered_tests)) self._setup_scenario(self.file_dir, None, exclude_tests=["*"]) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEquals(0, self.count_suite(filtered_tests)) + self.assertEquals(0, self.count_tests(filtered_tests)) def test_matching_tests(self): self._setup_scenario(self.file_dir, None, ['StillYetAnotherSampleTest']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(1, self.count_suite(filtered_tests)) + self.assertEqual(1, self.count_tests(filtered_tests)) self._setup_scenario(self.file_dir, None, ['SampleTest.test_xxxxxx1']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(1, self.count_suite(filtered_tests)) + self.assertEqual(1, self.count_tests(filtered_tests)) self._setup_scenario(self.file_dir, None, ['SampleTest']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(8, self.count_suite(filtered_tests)) + self.assertEqual(8, self.count_tests(filtered_tests)) self._setup_scenario(self.file_dir, None, ['AnotherSampleTest.todo_not_tested']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(1, self.count_suite(filtered_tests)) + self.assertEqual(1, self.count_tests(filtered_tests)) self._setup_scenario(self.file_dir, None, ['StillYetAnotherSampleTest', 'SampleTest.test_xxxxxx1']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(2, self.count_suite(filtered_tests)) + self.assertEqual(2, self.count_tests(filtered_tests)) self._setup_scenario(self.file_dir, None, exclude_tests=['*']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(self.count_suite(filtered_tests), 0) + self.assertEqual(self.count_tests(filtered_tests), 0) self._setup_scenario(self.file_dir, None, exclude_tests=['*a*']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(self.count_suite(filtered_tests), 6) + self.assertEqual(self.count_tests(filtered_tests), 6) self.assertEqual( set(self.MyTestRunner.list_test_names(filtered_tests)), @@ -269,7 +270,7 @@ class RunfilesTest(unittest.TestCase): self._setup_scenario(self.file_dir, None, exclude_tests=['*a*', '*x*']) filtered_tests = self.MyTestRunner.filter_tests(self.all_tests) - self.assertEqual(self.count_suite(filtered_tests), 2) + self.assertEqual(self.count_tests(filtered_tests), 2) self.assertEqual( set(self.MyTestRunner.list_test_names(filtered_tests)), @@ -362,43 +363,17 @@ class RunfilesTest(unittest.TestCase): ('notifyTest', 'ok', '', '', simple_test, 'SampleTest.test_xxxxxx2'), ('notifyTest', 'ok', '', '', simple_test2, 'YetAnotherSampleTest.test_abc'), ] - if not IS_JYTHON: - if 'samples.simpleClass_test' in str(notifications): - expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpClass.', - simpleClass_test.replace('/', os.path.sep), 'samples.simpleClass_test.SetUpClassTest ')) - expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpModule.', - simpleModule_test.replace('/', os.path.sep), 'samples.simpleModule_test ')) - else: - expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpClass.', - simpleClass_test.replace('/', os.path.sep), 'simpleClass_test.SetUpClassTest ')) - expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpModule.', - simpleModule_test.replace('/', os.path.sep), 'simpleModule_test ')) + expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpClass.', + simpleClass_test.replace('/', os.path.sep), 'samples.simpleClass_test.SetUpClassTest ')) + expected.append(('notifyTest', 'error', '', 'ValueError: This is an INTENTIONAL value error in setUpModule.', + simpleModule_test.replace('/', os.path.sep), 'samples.simpleModule_test ')) else: expected.append(('notifyTest', 'ok', '', '', simpleClass_test, 'SetUpClassTest.test_blank')) expected.append(('notifyTest', 'ok', '', '', simpleModule_test, 'SetUpModuleTest.test_blank')) expected.append(('notifyTestRunFinished',)) expected.sort() - new_notifications = [] - for notification in expected: - try: - if len(notification) == 6: - # Some are binary on Py3. - new_notifications.append(( - notification[0], - notification[1], - notification[2].encode('latin1'), - notification[3].encode('latin1'), - notification[4], - notification[5], - )) - else: - new_notifications.append(notification) - except: - raise - expected = new_notifications - notifications.sort() self.assertEqual( expected, diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixer_util.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixer_util.py index 79c5d6aadc8c..78fdf26dce4c 100644 --- a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixer_util.py +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixer_util.py @@ -1,6 +1,8 @@ """Utility functions, node construction macros, etc.""" # Author: Collin Winter +from itertools import islice + # Local imports from .pgen2 import token from .pytree import Leaf, Node diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_dict.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_dict.py index c3263309eec6..f681e4d71324 100644 --- a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_dict.py +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_dict.py @@ -30,8 +30,9 @@ as an argument to a function that introspects the argument). # Local imports from .. import pytree from .. import patcomp +from ..pgen2 import token from .. import fixer_base -from ..fixer_util import Name, Call, Dot +from ..fixer_util import Name, Call, LParen, RParen, ArgList, Dot from .. import fixer_util diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_exec.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_exec.py index 5500302f4e44..50e185445453 100644 --- a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_exec.py +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_exec.py @@ -10,6 +10,7 @@ exec code in ns1, ns2 -> exec(code, ns1, ns2) """ # Local imports +from .. import pytree from .. import fixer_base from ..fixer_util import Comma, Name, Call diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_filter.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_filter.py index 4cca0b4ebc26..18ee2ffc0627 100644 --- a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_filter.py +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_filter.py @@ -14,6 +14,7 @@ Python 2.6 figure it out. """ # Local imports +from ..pgen2 import token from .. import fixer_base from ..fixer_util import Name, Call, ListComp, in_special_context diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_has_key.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_has_key.py index 1b3853491942..bead4cb51cde 100644 --- a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_has_key.py +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_has_key.py @@ -31,6 +31,7 @@ CAVEATS: # Local imports from .. import pytree +from ..pgen2 import token from .. import fixer_base from ..fixer_util import Name, parenthesize diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_metaclass.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_metaclass.py index e0602ba3cc81..4f5593c5feb0 100644 --- a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_metaclass.py +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_metaclass.py @@ -20,7 +20,7 @@ # Local imports from .. import fixer_base from ..pygram import token -from ..fixer_util import syms, Node, Leaf +from ..fixer_util import Name, syms, Node, Leaf def has_metaclass(parent): diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_nonzero.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_nonzero.py index 2caf27928fea..ba83478f818a 100644 --- a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_nonzero.py +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_nonzero.py @@ -3,7 +3,7 @@ # Local imports from .. import fixer_base -from ..fixer_util import Name +from ..fixer_util import Name, syms class FixNonzero(fixer_base.BaseFix): BM_compatible = True diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_print.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_print.py index 5016917876cb..98786b3ecdc5 100644 --- a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_print.py +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_print.py @@ -18,7 +18,7 @@ from .. import patcomp from .. import pytree from ..pgen2 import token from .. import fixer_base -from ..fixer_util import Name, Call, Comma, String +from ..fixer_util import Name, Call, Comma, String, is_tuple parend_expr = patcomp.compile_pattern( diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_types.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_types.py index 696c82587d29..fc9d4959276a 100644 --- a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_types.py +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_types.py @@ -20,6 +20,7 @@ There should be another fixer that handles at least the following constants: """ # Local imports +from ..pgen2 import token from .. import fixer_base from ..fixer_util import Name diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_urllib.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_urllib.py index e7ff34d0f3e2..34e1b2702ba0 100644 --- a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_urllib.py +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/fixes/fix_urllib.py @@ -6,6 +6,7 @@ # Local imports from lib2to3.fixes.fix_imports import alternates, FixImports +from lib2to3 import fixer_base from lib2to3.fixer_util import (Name, Comma, FromImport, Newline, find_indentation, Node, syms) diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/grammar.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/grammar.py index 9df5244436a2..1aa5c4327803 100644 --- a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/grammar.py +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/grammar.py @@ -16,7 +16,7 @@ fallback token code OP, but the parser needs the actual token code. import pickle # Local imports -from . import token +from . import token, tokenize class Grammar(object): diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/tokenize.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/tokenize.py index b5f28cb79157..f6e0284c2f58 100644 --- a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/tokenize.py +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pgen2/tokenize.py @@ -29,12 +29,11 @@ __author__ = 'Ka-Ping Yee ' __credits__ = \ 'GvR, ESR, Tim Peters, Thomas Wouters, Fred Drake, Skip Montanaro' -import string -import re +import string, re from codecs import BOM_UTF8, lookup from lib2to3.pgen2.token import * -from . import token +from . import token __all__ = [x for x in dir(token) if x[0] != '_'] + ["tokenize", "generate_tokens", "untokenize"] del token diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pygram.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pygram.py index 9f036a018561..621ff24c9547 100644 --- a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pygram.py +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/pygram.py @@ -7,7 +7,9 @@ import os # Local imports +from .pgen2 import token from .pgen2 import driver +from . import pytree # The grammar file _GRAMMAR_FILE = os.path.join(os.path.dirname(__file__), "Grammar.txt") diff --git a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/refactor.py b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/refactor.py index a657d872e864..a4c168df9e0d 100644 --- a/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/refactor.py +++ b/python/helpers/pydev/third_party/pep8/lib2to3/lib2to3/refactor.py @@ -26,6 +26,7 @@ from itertools import chain from .pgen2 import driver, tokenize, token from .fixer_util import find_root from . import pytree, pygram +from . import btm_utils as bu from . import btm_matcher as bm diff --git a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/__init__.py b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/__init__.py index fb5582978802..3b927b4db451 100644 --- a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/__init__.py +++ b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/__init__.py @@ -1,8 +1,8 @@ #@PydevCodeAnalysisIgnore """create and manipulate C data types in Python""" -import os as _os -import sys as _sys +import os as _os, sys as _sys +from itertools import chain as _chain # special developer support to use ctypes from the CVS sandbox, # without installing it @@ -14,10 +14,12 @@ del _magicfile __version__ = "0.9.9.6" +from _ctypes import Union, Structure, Array from _ctypes import _Pointer from _ctypes import CFuncPtr as _CFuncPtr from _ctypes import __version__ as _ctypes_version -from _ctypes import RTLD_LOCAL +from _ctypes import RTLD_LOCAL, RTLD_GLOBAL +from _ctypes import ArgumentError from struct import calcsize as _calcsize @@ -118,7 +120,7 @@ if _os.name in ("nt", "ce"): elif _os.name == "posix": from _ctypes import dlopen as _dlopen #@UnresolvedImport -from _ctypes import sizeof +from _ctypes import sizeof, byref, addressof, alignment from _ctypes import _SimpleCData class py_object(_SimpleCData): @@ -500,6 +502,8 @@ if _os.name == "nt": # COM stuff pass return result +from ctypes._endian import BigEndianStructure, LittleEndianStructure + # Fill in specifically-sized types c_int8 = c_byte c_uint8 = c_ubyte diff --git a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/util.py b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/util.py index e72be2fb7174..6db0cfbb5ecc 100644 --- a/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/util.py +++ b/python/helpers/pydev/third_party/wrapped_for_pydev/ctypes/util.py @@ -1,6 +1,6 @@ #@PydevCodeAnalysisIgnore -import sys -import os +import sys, os +import ctypes # find_library(name) returns the pathname of a library, or None. if os.name == "nt": From 20b41d27934119dcf1863bd346d8e5b1d5d7b5fc Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 25 Aug 2014 12:18:06 +0400 Subject: [PATCH 03/97] allow plugins to suppress "interface never implemented" and "abstract class has no concrete subclass" inspections for classes which are implemented by proxies at runtime (e.g. for classes extending DomElement in DevKit) --- .../ImplementedAtRuntimeCondition.java | 29 ++++++++++++++++++ .../siyeh/ig/psiutils/InheritanceUtil.java | 6 ++++ plugins/devkit/resources/META-INF/plugin.xml | 1 + .../DevKitImplementedAtRuntimeCondition.java | 30 +++++++++++++++++++ .../DevKitImplicitUsageProvider.java | 2 +- .../DevKitImplicitUsageProviderTest.java | 3 +- resources/src/META-INF/IdeaPlugin.xml | 2 ++ 7 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ImplementedAtRuntimeCondition.java create mode 100644 plugins/devkit/src/inspections/DevKitImplementedAtRuntimeCondition.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ImplementedAtRuntimeCondition.java b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ImplementedAtRuntimeCondition.java new file mode 100644 index 000000000000..55918450f481 --- /dev/null +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ImplementedAtRuntimeCondition.java @@ -0,0 +1,29 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInspection.inheritance; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.psi.PsiClass; +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public abstract class ImplementedAtRuntimeCondition { + public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.codeInsight.implementedAtRuntime"); + + public abstract boolean isImplementedAtRuntime(@NotNull PsiClass psiClass); +} diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/InheritanceUtil.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/InheritanceUtil.java index 9661ba10e4c4..faea625f1db5 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/InheritanceUtil.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/InheritanceUtil.java @@ -15,6 +15,7 @@ */ package com.siyeh.ig.psiutils; +import com.intellij.codeInspection.inheritance.ImplementedAtRuntimeCondition; import com.intellij.openapi.progress.ProgressManager; import com.intellij.psi.CommonClassNames; import com.intellij.psi.PsiClass; @@ -80,6 +81,11 @@ public class InheritanceUtil { public static boolean hasImplementation(@NotNull PsiClass aClass) { final SearchScope scope = GlobalSearchScope.projectScope(aClass.getProject()); if (aClass.isInterface() && FunctionalExpressionSearch.search(aClass, scope).findFirst() != null) return true; + for (ImplementedAtRuntimeCondition condition : ImplementedAtRuntimeCondition.EP_NAME.getExtensions()) { + if (condition.isImplementedAtRuntime(aClass)) { + return true; + } + } final Query search = ClassInheritorsSearch.search(aClass, scope, true, true); return !search.forEach(new Processor() { @Override diff --git a/plugins/devkit/resources/META-INF/plugin.xml b/plugins/devkit/resources/META-INF/plugin.xml index 0a9501ebef94..ef3688448fda 100644 --- a/plugins/devkit/resources/META-INF/plugin.xml +++ b/plugins/devkit/resources/META-INF/plugin.xml @@ -152,6 +152,7 @@ implementationClass="org.jetbrains.idea.devkit.navigation.DescriptionTypeRelatedItemLineMarkerProvider"/> + diff --git a/plugins/devkit/src/inspections/DevKitImplementedAtRuntimeCondition.java b/plugins/devkit/src/inspections/DevKitImplementedAtRuntimeCondition.java new file mode 100644 index 000000000000..f6cbe5e97a74 --- /dev/null +++ b/plugins/devkit/src/inspections/DevKitImplementedAtRuntimeCondition.java @@ -0,0 +1,30 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.devkit.inspections; + +import com.intellij.codeInspection.inheritance.ImplementedAtRuntimeCondition; +import com.intellij.psi.PsiClass; +import org.jetbrains.annotations.NotNull; + +/** + * @author nik + */ +public class DevKitImplementedAtRuntimeCondition extends ImplementedAtRuntimeCondition { + @Override + public boolean isImplementedAtRuntime(@NotNull PsiClass psiClass) { + return DevKitImplicitUsageProvider.isDomElementClass(psiClass); + } +} diff --git a/plugins/devkit/src/inspections/DevKitImplicitUsageProvider.java b/plugins/devkit/src/inspections/DevKitImplicitUsageProvider.java index fa87c70ad337..7aeb7a047046 100644 --- a/plugins/devkit/src/inspections/DevKitImplicitUsageProvider.java +++ b/plugins/devkit/src/inspections/DevKitImplicitUsageProvider.java @@ -50,7 +50,7 @@ public class DevKitImplicitUsageProvider implements ImplicitUsageProvider { return false; } - private static boolean isDomElementClass(PsiClass psiClass) { + static boolean isDomElementClass(PsiClass psiClass) { if (psiClass.isEnum() || psiClass.isAnnotationType() || psiClass.hasModifierProperty(PsiModifier.PRIVATE)) { diff --git a/plugins/devkit/testSources/inspections/DevKitImplicitUsageProviderTest.java b/plugins/devkit/testSources/inspections/DevKitImplicitUsageProviderTest.java index bf33c2174159..cdfbd460643f 100644 --- a/plugins/devkit/testSources/inspections/DevKitImplicitUsageProviderTest.java +++ b/plugins/devkit/testSources/inspections/DevKitImplicitUsageProviderTest.java @@ -20,6 +20,7 @@ import com.intellij.codeInspection.unusedSymbol.UnusedSymbolLocalInspection; import com.intellij.openapi.application.PluginPathManager; import com.intellij.testFramework.TestDataPath; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; +import com.siyeh.ig.inheritance.AbstractClassNeverImplementedInspection; @TestDataPath("$CONTENT_ROOT/testData/inspections/implicitUsage") public class DevKitImplicitUsageProviderTest extends LightCodeInsightFixtureTestCase { @@ -37,7 +38,7 @@ public class DevKitImplicitUsageProviderTest extends LightCodeInsightFixtureTest myFixture.addClass("package com.intellij.util.xml; public interface DomElementVisitor {}"); myFixture.addClass("package com.intellij.util.xml; public interface GenericAttributeValue extends DomElement {}"); - myFixture.enableInspections(new UnusedSymbolLocalInspection(), new UnusedDeclarationInspection()); + myFixture.enableInspections(new UnusedSymbolLocalInspection(), new UnusedDeclarationInspection(), new AbstractClassNeverImplementedInspection()); } public void testImplicitUsagesDomElement() { diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index d96c213a18fd..ec30ca2614dc 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -46,6 +46,8 @@ + From a2038c5e2168ad88de1011b32ff6661e9f34d2cd Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 25 Aug 2014 10:25:22 +0200 Subject: [PATCH 04/97] make IG test light --- .../migration/if_switch/IfCanBeSwitch.java | 12 ++--- .../igtest/migration/if_switch/expected.xml | 44 ------------------- .../IfCanBeSwitchInspectionTest.java | 24 +++++++--- 3 files changed, 23 insertions(+), 57 deletions(-) delete mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/migration/if_switch/expected.xml diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/if_switch/IfCanBeSwitch.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/if_switch/IfCanBeSwitch.java index 7bfc8aa08ff0..6b6a48a35428 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/if_switch/IfCanBeSwitch.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/if_switch/IfCanBeSwitch.java @@ -2,15 +2,15 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; class IfCanBeSwitch { void m1(int i) { // ok - if (i == 0) System.out.println("zero"); else if (i == 1) System.out.println("one"); else System.out.println("many"); + if (i == 0) System.out.println("zero"); else if (i == 1) System.out.println("one"); else System.out.println("many"); } void m1(char c) { // ok - if (c == '0') System.out.println("zero"); else if (c == '1') System.out.println("one"); else System.out.println("many"); + if (c == '0') System.out.println("zero"); else if (c == '1') System.out.println("one"); else System.out.println("many"); } void m1(byte i) { // ok - if (i == (byte)0) System.out.println("zero"); else if (i == (byte)1) System.out.println("one"); else System.out.println("many"); + if (i == (byte)0) System.out.println("zero"); else if (i == (byte)1) System.out.println("one"); else System.out.println("many"); } void m2(int i) { // bad, long literals @@ -23,7 +23,7 @@ class IfCanBeSwitch { void polyadic() { String s = null; - if (s.equals("asdf") || s.equals("addd") || s.equals("lkjh")) { + if (s.equals("asdf") || s.equals("addd") || s.equals("lkjh")) { System.out.println("asdf"); } else if (s.equals("null")) { @@ -59,14 +59,14 @@ class IfCanBeSwitch { } void nullSafe(String earth) { - if (earth.equals("foo")) { + if (earth.equals("foo")) { } else if ("bar".equals(earth)) { } else { } } void nullSafe2(@NotNull String narf) { - if ("foo".equals((narf))) { + if ("foo".equals((narf))) { // do this } else if ("bar".equals(narf)){ // do that diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/if_switch/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/if_switch/expected.xml deleted file mode 100644 index e56ebb574747..000000000000 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/if_switch/expected.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - IfCanBeSwitch.java - 5 - 'if' replaceable with 'switch' - <code>if</code> statement replaceable with 'switch' statement #loc - - - - IfCanBeSwitch.java - 9 - 'if' replaceable with 'switch' - <code>if</code> statement replaceable with 'switch' statement #loc - - - - IfCanBeSwitch.java - 13 - 'if' replaceable with 'switch' - <code>if</code> statement replaceable with 'switch' statement #loc - - - - IfCanBeSwitch.java - 26 - 'if' replaceable with 'switch' - <code>if</code> statement replaceable with 'switch' statement #loc - - - - IfCanBeSwitch.java - 62 - 'if' replaceable with 'switch' - <code>if</code> statement replaceable with 'switch' statement #loc - - - - IfCanBeSwitch.java - 69 - 'if' replaceable with 'switch' - <code>if</code> statement replaceable with 'switch' statement #loc - - \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/IfCanBeSwitchInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/IfCanBeSwitchInspectionTest.java index 9b1f2574dd77..9aec756d9ae2 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/IfCanBeSwitchInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/IfCanBeSwitchInspectionTest.java @@ -15,25 +15,35 @@ */ package com.siyeh.ig.migration; +import com.intellij.codeInspection.InspectionProfileEntry; import com.intellij.codeInspection.ex.LocalInspectionToolWrapper; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.LanguageLevelProjectExtension; import com.intellij.pom.java.LanguageLevel; import com.intellij.testFramework.IdeaTestUtil; +import com.intellij.testFramework.LightProjectDescriptor; import com.siyeh.ig.IGInspectionTestCase; +import com.siyeh.ig.LightInspectionTestCase; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public class IfCanBeSwitchInspectionTest extends IGInspectionTestCase { +public class IfCanBeSwitchInspectionTest extends LightInspectionTestCase { - @Override - protected Sdk getTestProjectSdk() { - LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_7); - return IdeaTestUtil.getMockJdk17(); + public void testIfCanBeSwitch() throws Exception { + doTest(); } - public void test() throws Exception { + @Nullable + @Override + protected InspectionProfileEntry getInspection() { final IfCanBeSwitchInspection inspection = new IfCanBeSwitchInspection(); inspection.suggestIntSwitches = true; inspection.setOnlySuggestNullSafe(true); - doTest("com/siyeh/igtest/migration/if_switch", new LocalInspectionToolWrapper(inspection)); + return inspection; + } + + @Override + protected String getBasePath() { + return "/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/if_switch"; } } From 3038e9c0b2dd4de7dbb3671ef9a13c0aaafc4308 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 25 Aug 2014 10:31:18 +0200 Subject: [PATCH 05/97] IDEA-128911 (Replace 'if' with 'switch' should work when switching over getter return values) --- .../siyeh/ig/psiutils/SideEffectChecker.java | 9 +++++++++ .../migration/if_switch/IfCanBeSwitch.java | 17 +++++++++++++++++ .../migration/IfCanBeSwitchInspectionTest.java | 1 + 3 files changed, 27 insertions(+) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SideEffectChecker.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SideEffectChecker.java index 5063ef7c2ea7..782b667469af 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SideEffectChecker.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SideEffectChecker.java @@ -17,6 +17,7 @@ package com.siyeh.ig.psiutils; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.util.PropertyUtil; import org.jetbrains.annotations.NotNull; public class SideEffectChecker { @@ -59,6 +60,14 @@ public class SideEffectChecker { return; } super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if ((methodName.startsWith("is") || methodName.startsWith("get")) && expression.getArgumentList().getExpressions().length == 0) { + final PsiMethod method = expression.resolveMethod(); + if (PropertyUtil.isSimpleGetter(method)) { + return; + } + } mayHaveSideEffects = true; } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/if_switch/IfCanBeSwitch.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/if_switch/IfCanBeSwitch.java index 6b6a48a35428..a0456798059d 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/if_switch/IfCanBeSwitch.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/if_switch/IfCanBeSwitch.java @@ -75,4 +75,21 @@ class IfCanBeSwitch { // do something else. } } + + Num num; + enum Num { + ONE, TWO + } + Num getNum() { + return num; + } + void ifWithGetterToSwitch() { + if (getNum() == Num.ONE) { + System.out.println(1); + } else if (getNum() == Num.TWO) { + System.out.println(2); + } else { + System.out.println("-"); + } + } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/IfCanBeSwitchInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/IfCanBeSwitchInspectionTest.java index 9aec756d9ae2..a13e61bfd234 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/IfCanBeSwitchInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/migration/IfCanBeSwitchInspectionTest.java @@ -38,6 +38,7 @@ public class IfCanBeSwitchInspectionTest extends LightInspectionTestCase { protected InspectionProfileEntry getInspection() { final IfCanBeSwitchInspection inspection = new IfCanBeSwitchInspection(); inspection.suggestIntSwitches = true; + inspection.suggestEnumSwitches = true; inspection.setOnlySuggestNullSafe(true); return inspection; } From 8b9d68b227d5ed6d027991553aee51c3c6452eb5 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 25 Aug 2014 10:59:51 +0200 Subject: [PATCH 06/97] IDEA-123292 ((x[i++] - x[i++]) does not equal zero) --- .../PointlessArithmeticExpressionInspection.java | 12 +++++++++--- .../PointlessArithmeticExpression.java | 15 +++++++++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/PointlessArithmeticExpressionInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/PointlessArithmeticExpressionInspection.java index a682ef5b2b5c..2dde6969545d 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/PointlessArithmeticExpressionInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/numeric/PointlessArithmeticExpressionInspection.java @@ -29,6 +29,7 @@ import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.PsiReplacementUtil; import com.siyeh.ig.psiutils.EquivalenceChecker; import com.siyeh.ig.psiutils.ExpressionUtils; +import com.siyeh.ig.psiutils.SideEffectChecker; import gnu.trove.THashSet; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -232,7 +233,7 @@ public class PointlessArithmeticExpressionInspection for (int i = 0; i < expressions.length; i++) { PsiExpression expression = expressions[i]; if (previousExpression != null && - (isZero(expression) || i == 1 && EquivalenceChecker.expressionsAreEquivalent(previousExpression, expression))) { + (isZero(expression) || areExpressionsIdenticalWithoutSideEffects(previousExpression, expression, i))) { return true; } previousExpression = expression; @@ -263,7 +264,7 @@ public class PointlessArithmeticExpressionInspection for (int i = 0; i < expressions.length; i++) { final PsiExpression expression = expressions[i]; if (previousExpression != null && - (isOne(expression) || i == 1 && EquivalenceChecker.expressionsAreEquivalent(previousExpression, expression))) { + (isOne(expression) || areExpressionsIdenticalWithoutSideEffects(previousExpression, expression, i))) { return true; } previousExpression = expression; @@ -276,13 +277,18 @@ public class PointlessArithmeticExpressionInspection for (int i = 0; i < expressions.length; i++) { final PsiExpression expression = expressions[i]; if (previousExpression != null && - (isOne(expression) || i == 1 && EquivalenceChecker.expressionsAreEquivalent(previousExpression, expression))) { + (isOne(expression) || areExpressionsIdenticalWithoutSideEffects(previousExpression, expression, i))) { return true; } previousExpression = expression; } return false; } + + private boolean areExpressionsIdenticalWithoutSideEffects(PsiExpression expression1, PsiExpression expression2, int index) { + return index == 1 && EquivalenceChecker.expressionsAreEquivalent(expression1, expression2) && + !SideEffectChecker.mayHaveSideEffects(expression1); + } } boolean isZero(PsiExpression expression) { diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/numeric/pointless_arithmetic_expression/PointlessArithmeticExpression.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/numeric/pointless_arithmetic_expression/PointlessArithmeticExpression.java index 980c5e5d91af..9a10262e3148 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/numeric/pointless_arithmetic_expression/PointlessArithmeticExpression.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/numeric/pointless_arithmetic_expression/PointlessArithmeticExpression.java @@ -1,5 +1,7 @@ package com.siyeh.igtest.numeric.pointless_arithmetic_expression; +import java.util.Random; + public class PointlessArithmeticExpression { private static final int ZERO_CONSTANT = 0; @@ -108,7 +110,7 @@ class Main { int fly(int i) { final Main main = new Main(12); - return (CONST + (new Main(5).i) * 8) - (Main.CONST + new Main(5).i * (8)); + return (CONST + (new Main(5).i) * 8) - (Main.CONST + new Main(5).i * (8)); } int one = 5/5; @@ -127,4 +129,13 @@ class Expanded {{ int minus = 2 - 1 - 1; int div = 3 / 2 / 2; int mod = 3 % 2 % 2; -}} \ No newline at end of file +}} +class SideEffects { + public static void main( String args[] ){ + Random rand = new Random(); + int array[] = {1, 2, 4}; + int i = 1; + int b = array[i++] - array[i++]; + System.out.println(rand.nextInt(1000) - rand.nextInt(1000)); + } +} \ No newline at end of file From 866b919830a0098bdc3d04496d8710d323129310 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 22 Aug 2014 10:47:18 +0400 Subject: [PATCH 07/97] read action --- .../psi/search/searches/ReferencesSearch.java | 14 +++----------- .../fxml/refs/JavaFxControllerFieldSearcher.java | 8 ++------ 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/platform/indexing-api/src/com/intellij/psi/search/searches/ReferencesSearch.java b/platform/indexing-api/src/com/intellij/psi/search/searches/ReferencesSearch.java index 4271680aea1b..1820de4b2336 100644 --- a/platform/indexing-api/src/com/intellij/psi/search/searches/ReferencesSearch.java +++ b/platform/indexing-api/src/com/intellij/psi/search/searches/ReferencesSearch.java @@ -15,13 +15,11 @@ */ package com.intellij.psi.search.searches; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.extensions.ExtensionPointName; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Computable; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; import com.intellij.psi.search.*; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.*; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -91,7 +89,7 @@ public class ReferencesSearch extends ExtensibleQueryFactory search(@NotNull PsiElement element) { - return search(element, GlobalSearchScope.allScope(element.getProject()), false); + return search(element, GlobalSearchScope.allScope(PsiUtilCore.getProjectInReadAction(element)), false); } @NotNull @@ -115,13 +113,7 @@ public class ReferencesSearch extends ExtensibleQueryFactory(result, new SearchRequestQuery( - ApplicationManager.getApplication().runReadAction(new Computable() { - @Override - public Project compute() { - return element.getProject(); - } - }), requests))); + return uniqueResults(new MergeQuery(result, new SearchRequestQuery(PsiUtilCore.getProjectInReadAction(element), requests))); } @NotNull diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxControllerFieldSearcher.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxControllerFieldSearcher.java index 4e9ab75451fe..742f84fd3efc 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxControllerFieldSearcher.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxControllerFieldSearcher.java @@ -24,6 +24,7 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.util.Processor; @@ -58,12 +59,7 @@ public class JavaFxControllerFieldSearcher implements QueryExecutor() { - @Override - public Project compute() { - return containingClass.getProject(); - } - }); + Project project = PsiUtilCore.getProjectInReadAction(containingClass); final List fxmlWithController = JavaFxControllerClassIndex.findFxmlWithController(project, qualifiedName); for (final PsiFile file : fxmlWithController) { From 40e7c9c25d8db9a5f84e868ef49418a87d5187e7 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 22 Aug 2014 13:01:46 +0400 Subject: [PATCH 08/97] read action --- .../MethodImplementationsSearch.java | 2 +- .../search/AnnotatedElementsSearcher.java | 8 +- .../search/AnnotatedPackagesSearcher.java | 88 ++++++++----- .../JavaAllOverridingMethodsSearcher.java | 19 ++- .../search/JavaDirectInheritorsSearcher.java | 30 ++++- .../JavaFunctionalExpressionSearcher.java | 120 ++++++++++-------- .../search/MethodDeepestSuperSearcher.java | 26 +++- .../psi/impl/search/MethodSuperSearcher.java | 42 ++++-- ...PsiAnnotationMethodReferencesSearcher.java | 39 +++++- .../findUsages/AnnotatedMembersSearcher.java | 108 +++++++++------- 10 files changed, 315 insertions(+), 167 deletions(-) diff --git a/java/java-indexing-impl/src/com/intellij/codeInsight/navigation/MethodImplementationsSearch.java b/java/java-indexing-impl/src/com/intellij/codeInsight/navigation/MethodImplementationsSearch.java index 2e05e4cbc8aa..9a5f5ac4ddc1 100644 --- a/java/java-indexing-impl/src/com/intellij/codeInsight/navigation/MethodImplementationsSearch.java +++ b/java/java-indexing-impl/src/com/intellij/codeInsight/navigation/MethodImplementationsSearch.java @@ -50,7 +50,7 @@ public class MethodImplementationsSearch implements QueryExecutor methods = new ArrayList(); + List methods = new ArrayList(); getOverridingMethods(psiMethod, methods, searchScope); return ContainerUtil.process(methods, consumer); } diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java index dec2dccb341e..53fa2eb48604 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedElementsSearcher.java @@ -18,7 +18,6 @@ package com.intellij.psi.impl.search; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.Computable; import com.intellij.psi.*; -import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.LocalSearchScope; @@ -50,7 +49,12 @@ public class AnnotatedElementsSearcher implements QueryExecutor() { + @Override + public PsiManager compute() { + return annClass.getManager(); + } + }); final SearchScope useScope = p.getScope(); final Class[] types = p.getTypes(); diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedPackagesSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedPackagesSearcher.java index 4437b3f49e51..51565a81e5f4 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedPackagesSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/AnnotatedPackagesSearcher.java @@ -19,15 +19,15 @@ */ package com.intellij.psi.impl.search; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PsiSearchHelper; -import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.AnnotatedPackagesSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Processor; @@ -44,49 +44,67 @@ public class AnnotatedPackagesSearcher implements QueryExecutor() { + @Override + public String compute() { + return annClass.getQualifiedName(); + } + }); assert annotationFQN != null; - final PsiManagerImpl psiManager = (PsiManagerImpl)annClass.getManager(); - final SearchScope useScope = p.getScope(); + final PsiManager psiManager = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public PsiManager compute() { + return annClass.getManager(); + } + }); + final GlobalSearchScope useScope = (GlobalSearchScope)p.getScope(); - final String annotationShortName = annClass.getName(); + final String annotationShortName = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public String compute() { + return annClass.getName(); + } + }); assert annotationShortName != null; - final GlobalSearchScope scope = useScope instanceof GlobalSearchScope ? (GlobalSearchScope)useScope : null; + final Collection annotations = JavaAnnotationIndex.getInstance().get(annotationShortName, psiManager.getProject(), + useScope); - final Collection annotations = JavaAnnotationIndex.getInstance().get(annotationShortName, psiManager.getProject(), scope); - for (PsiAnnotation annotation : annotations) { - PsiModifierList modlist = (PsiModifierList)annotation.getParent(); - final PsiElement owner = modlist.getParent(); - if (!(owner instanceof PsiClass)) continue; - PsiClass candidate = (PsiClass)owner; - if (!"package-info".equals(candidate.getName())) continue; - - LOG.assertTrue(candidate.isValid()); - - final PsiJavaCodeReferenceElement ref = annotation.getNameReferenceElement(); - if (ref == null) continue; - - if (!psiManager.areElementsEquivalent(ref.resolve(), annClass)) continue; - if (useScope instanceof GlobalSearchScope && - !((GlobalSearchScope)useScope).contains(candidate.getContainingFile().getVirtualFile())) { - continue; - } - final String qname = candidate.getQualifiedName(); - if (qname != null && !consumer.process(JavaPsiFacade.getInstance(psiManager.getProject()).findPackage( - qname.substring(0, qname.lastIndexOf('.'))))) { - return false; - } + for (final PsiAnnotation annotation : annotations) { + boolean accepted = ApplicationManager.getApplication().runReadAction(new Computable(){ + @Override + public Boolean compute() { + PsiModifierList modlist = (PsiModifierList)annotation.getParent(); + final PsiElement owner = modlist.getParent(); + if ((owner instanceof PsiClass)) { + PsiClass candidate = (PsiClass)owner; + if ("package-info".equals(candidate.getName())) { + LOG.assertTrue(candidate.isValid()); + final PsiJavaCodeReferenceElement ref = annotation.getNameReferenceElement(); + if (ref != null && psiManager.areElementsEquivalent(ref.resolve(), annClass) && + useScope.contains(candidate.getContainingFile().getVirtualFile())) { + final String qname = candidate.getQualifiedName(); + if (qname != null && !consumer.process(JavaPsiFacade.getInstance(psiManager.getProject()).findPackage( + qname.substring(0, qname.lastIndexOf('.'))))) { + return false; + } + } + } + } + return true; + } + }); + if (!accepted) return false; } PsiSearchHelper helper = PsiSearchHelper.SERVICE.getInstance(psiManager.getProject()); final GlobalSearchScope infoFilesFilter = new PackageInfoFilesOnly(); GlobalSearchScope infoFiles = - useScope instanceof GlobalSearchScope ? ((GlobalSearchScope)useScope).intersectWith(infoFilesFilter) : infoFilesFilter; + useScope.intersectWith(infoFilesFilter); - final boolean[] wantmore = {true}; + final boolean[] wantMore = {true}; helper.processAllFilesWithWord(annotationShortName, infoFiles, new Processor() { @Override public boolean process(final PsiFile psiFile) { @@ -103,12 +121,12 @@ public class AnnotatedPackagesSearcher implements QueryExecutor> consumer) { final PsiClass psiClass = p.getPsiClass(); - PsiMethod[] methodsArray = psiClass.getMethods(); - final List methods = new ArrayList(methodsArray.length); - for (PsiMethod method : methodsArray) { - if (PsiUtil.canBeOverriden(method)) methods.add(method); - } + final List methods = ApplicationManager.getApplication().runReadAction(new Computable>() { + @Override + public List compute() { + PsiMethod[] methodsArray = psiClass.getMethods(); + final List methods = new ArrayList(methodsArray.length); + for (PsiMethod method : methodsArray) { + if (PsiUtil.canBeOverriden(method)) methods.add(method); + } + return methods; + } + }); + final SearchScope scope = p.getScope(); diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaDirectInheritorsSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaDirectInheritorsSearcher.java index d7d5cb8fce21..287d43f4cf2d 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaDirectInheritorsSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaDirectInheritorsSearcher.java @@ -110,9 +110,14 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor> classes = new HashMap>(); - for (PsiReferenceList referenceList : candidates) { + for (final PsiReferenceList referenceList : candidates) { ProgressIndicatorProvider.checkCanceled(); - final PsiClass candidate = (PsiClass)referenceList.getParent(); + final PsiClass candidate = (PsiClass)ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public PsiElement compute() { + return referenceList.getParent(); + } + }); if (!checkInheritance(p, aClass, candidate)) continue; String fqn = ApplicationManager.getApplication().runReadAction(new Computable() { @@ -148,7 +153,13 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor() { + @Override + public Boolean compute() { + return aClass.isEnum(); + } + }); + if (isEnum) { // abstract enum can be subclassed in the body PsiField[] fields = ApplicationManager.getApplication().runReadAction(new Computable() { @Override @@ -189,10 +200,10 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor() { + @Override + public VirtualFile compute() { + return PsiUtil.getJarFile(aClass); + } + }); + } } diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java index 2ee2cc2d8123..f73af1d24902 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java @@ -27,6 +27,7 @@ import com.intellij.psi.search.searches.FunctionalExpressionSearch; import com.intellij.psi.search.searches.MethodReferencesSearch; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.Processor; import com.intellij.util.QueryExecutor; import org.jetbrains.annotations.NotNull; @@ -36,15 +37,15 @@ import java.util.Collection; public class JavaFunctionalExpressionSearcher implements QueryExecutor { @Override - public boolean execute(final @NotNull FunctionalExpressionSearch.SearchParameters queryParameters, - final @NotNull Processor consumer) { + public boolean execute(@NotNull final FunctionalExpressionSearch.SearchParameters queryParameters, + @NotNull final Processor consumer) { final PsiClass aClass = queryParameters.getElementToSearch(); - if (!ApplicationManager.getApplication().runReadAction(new Computable() { + if (ApplicationManager.getApplication().runReadAction(new Computable() { @Override public Boolean compute() { - return LambdaUtil.isFunctionalClass(aClass); + return !LambdaUtil.isFunctionalClass(aClass) || !PsiUtil.isLanguageLevel8OrHigher(aClass); } - }) || !PsiUtil.isLanguageLevel8OrHigher(aClass)) { + })) { return true; } return collectFunctionalExpressions(aClass, ApplicationManager.getApplication().runReadAction(new Computable() { @@ -65,7 +66,7 @@ public class JavaFunctionalExpressionSearcher implements QueryExecutor lambdaCandidates = ApplicationManager.getApplication().runReadAction(new Computable>() { @Override @@ -76,16 +77,16 @@ public class JavaFunctionalExpressionSearcher implements QueryExecutor() { - @Override - public Boolean compute() { + for (final PsiReference ref : MethodReferencesSearch.search(psiMethod, scope, false)) { + boolean accepted = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public Boolean compute() { + final PsiElement refElement = ref.getElement(); + if (refElement != null) { + final PsiElement candidateElement = refElement.getParent(); + if (candidateElement instanceof PsiCallExpression) { + final PsiExpressionList argumentList = ((PsiCallExpression)candidateElement).getArgumentList(); + if (argumentList != null) { final PsiExpression[] args = argumentList.getExpressions(); for (PsiExpression arg : args) { if (arg instanceof PsiFunctionalExpression) { @@ -96,57 +97,66 @@ public class JavaFunctionalExpressionSearcher implements QueryExecutor() { + @Override + public Boolean compute() { + final PsiElement element = reference.getElement(); + if (element != null) { + final PsiElement parent = element.getParent(); + if (parent instanceof PsiTypeElement) { + final PsiElement gParent = parent.getParent(); + if (gParent instanceof PsiVariable) { + final PsiExpression initializer = PsiUtil.skipParenthesizedExprDown(((PsiVariable)gParent).getInitializer()); + if (initializer instanceof PsiFunctionalExpression) { + if (!consumer.process((PsiFunctionalExpression)initializer)) return false; + } + for (PsiReference varRef : ReferencesSearch.search(parent, scope)) { + final PsiElement varElement = varRef.getElement(); + if (varElement != null) { + final PsiElement varElementParent = varElement.getParent(); + if (varElementParent instanceof PsiAssignmentExpression && + ((PsiAssignmentExpression)varElementParent).getLExpression() == varElement) { + final PsiExpression rExpression = PsiUtil.skipParenthesizedExprDown(((PsiAssignmentExpression)varElementParent).getRExpression()); + if (rExpression instanceof PsiFunctionalExpression) { + if (!consumer.process((PsiFunctionalExpression)rExpression)) return false; + } + } + } + } + } else if (gParent instanceof PsiMethod) { + final PsiReturnStatement[] returnStatements = ApplicationManager.getApplication().runReadAction( + new Computable() { + @Override + public PsiReturnStatement[] compute() { + return PsiUtil.findReturnStatements((PsiMethod)gParent); + } + }); + for (PsiReturnStatement returnStatement : returnStatements) { + final PsiExpression returnValue = returnStatement.getReturnValue(); + if (returnValue instanceof PsiFunctionalExpression) { + if (!consumer.process((PsiFunctionalExpression)returnValue)) return false; } } } } - } else if (gParent instanceof PsiMethod) { - final PsiReturnStatement[] returnStatements = ApplicationManager.getApplication().runReadAction( - new Computable() { - @Override - public PsiReturnStatement[] compute() { - return PsiUtil.findReturnStatements((PsiMethod)gParent); - } - }); - for (PsiReturnStatement returnStatement : returnStatements) { - final PsiExpression returnValue = returnStatement.getReturnValue(); - if (returnValue instanceof PsiFunctionalExpression) { - if (!consumer.process((PsiFunctionalExpression)returnValue)) return false; - } - } } + + return true; } - } + }); + if (!accepted) return false; + } return true; } diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/MethodDeepestSuperSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/MethodDeepestSuperSearcher.java index ece2108b072c..933998344add 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/MethodDeepestSuperSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/MethodDeepestSuperSearcher.java @@ -1,5 +1,22 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.intellij.psi.impl.search; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.util.Computable; import com.intellij.psi.PsiMethod; import com.intellij.util.Processor; import com.intellij.util.QueryExecutor; @@ -23,12 +40,17 @@ public class MethodDeepestSuperSearcher implements QueryExecutor set, Set guard, Processor processor) { if (guard != null && !guard.add(method)) return true; - PsiMethod[] supers = method.findSuperMethods(); + PsiMethod[] supers = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public PsiMethod[] compute() { + return method.findSuperMethods(); + } + }); if (supers.length == 0 && set.add(method) && !processor.process(method)) { return false; diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/MethodSuperSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/MethodSuperSearcher.java index d65e80e7f997..acb5faae4947 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/MethodSuperSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/MethodSuperSearcher.java @@ -1,6 +1,23 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.intellij.psi.impl.search; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Computable; import com.intellij.psi.*; import com.intellij.psi.search.searches.SuperMethodsSearch; import com.intellij.psi.util.InheritanceUtil; @@ -22,18 +39,23 @@ public class MethodSuperSearcher implements QueryExecutor consumer) { final PsiClass parentClass = queryParameters.getPsiClass(); final PsiMethod method = queryParameters.getMethod(); - HierarchicalMethodSignature signature = method.getHierarchicalMethodSignature(); + return ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public Boolean compute() { + HierarchicalMethodSignature signature = method.getHierarchicalMethodSignature(); - final boolean checkBases = queryParameters.isCheckBases(); - final boolean allowStaticMethod = queryParameters.isAllowStaticMethod(); - final List supers = signature.getSuperSignatures(); - for (HierarchicalMethodSignature superSignature : supers) { - if (MethodSignatureUtil.isSubsignature(superSignature, signature)) { - if (!addSuperMethods(superSignature, method, parentClass, allowStaticMethod, checkBases, consumer)) return false; + final boolean checkBases = queryParameters.isCheckBases(); + final boolean allowStaticMethod = queryParameters.isAllowStaticMethod(); + final List supers = signature.getSuperSignatures(); + for (HierarchicalMethodSignature superSignature : supers) { + if (MethodSignatureUtil.isSubsignature(superSignature, signature)) { + if (!addSuperMethods(superSignature, method, parentClass, allowStaticMethod, checkBases, consumer)) return false; + } + } + + return true; } - } - - return true; + }); } private static boolean addSuperMethods(final HierarchicalMethodSignature signature, diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/PsiAnnotationMethodReferencesSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/PsiAnnotationMethodReferencesSearcher.java index 50f10caef9cb..b5a6fc58d425 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/PsiAnnotationMethodReferencesSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/PsiAnnotationMethodReferencesSearcher.java @@ -1,5 +1,22 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.intellij.psi.impl.search; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.util.Computable; import com.intellij.psi.*; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiUtil; @@ -16,10 +33,24 @@ public class PsiAnnotationMethodReferencesSearcher implements QueryExecutor consumer) { final PsiElement refElement = p.getElementToSearch(); - if (PsiUtil.isAnnotationMethod(refElement)) { - PsiMethod method = (PsiMethod)refElement; - if (PsiAnnotation.DEFAULT_REFERENCED_METHOD_NAME.equals(method.getName()) && method.getParameterList().getParametersCount() == 0) { - final Query query = ReferencesSearch.search(method.getContainingClass(), p.getScope(), p.isIgnoreAccessScope()); + boolean isAnnotation = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public Boolean compute() { + return PsiUtil.isAnnotationMethod(refElement); + } + }); + if (isAnnotation) { + final PsiMethod method = (PsiMethod)refElement; + PsiClass containingClass = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public PsiClass compute() { + boolean isValueMethod = + PsiAnnotation.DEFAULT_REFERENCED_METHOD_NAME.equals(method.getName()) && method.getParameterList().getParametersCount() == 0; + return isValueMethod ? method.getContainingClass() : null; + } + }); + if (containingClass != null) { + final Query query = ReferencesSearch.search(containingClass, p.getScope(), p.isIgnoreAccessScope()); return query.forEach(createImplicitDefaultAnnotationMethodConsumer(consumer)); } } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/findUsages/AnnotatedMembersSearcher.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/findUsages/AnnotatedMembersSearcher.java index cf1fe7234f77..eb702e373b59 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/findUsages/AnnotatedMembersSearcher.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/findUsages/AnnotatedMembersSearcher.java @@ -15,9 +15,7 @@ */ package org.jetbrains.plugins.groovy.findUsages; -import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.util.Computable; import com.intellij.psi.*; import com.intellij.psi.impl.search.AnnotatedElementsSearcher; @@ -48,7 +46,12 @@ public class AnnotatedMembersSearcher implements QueryExecutor getAnnotatedMemberCandidates(final PsiClass clazz, final GlobalSearchScope scope) { - final String name = clazz.getName(); + final String name = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public String compute() { + return clazz.getName(); + } + }); if (name == null) return Collections.emptyList(); final Collection members = ApplicationManager.getApplication().runReadAction(new Computable>() { @Override @@ -60,14 +63,20 @@ public class AnnotatedMembersSearcher implements QueryExecutor result = new ArrayList(); - for (PsiElement element : members) { - if (element instanceof GroovyFile) { - element = ((GroovyFile)element).getPackageDefinition(); - } - if (element instanceof PsiModifierListOwner) { - result.add((PsiModifierListOwner)element); - } + final List result = new ArrayList(); + for (final PsiElement element : members) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + PsiElement e = + element instanceof GroovyFile ? + ((GroovyFile)element).getPackageDefinition() : element; + + if (e instanceof PsiModifierListOwner) { + result.add((PsiModifierListOwner)e); + } + } + }); } return result; } @@ -77,14 +86,12 @@ public class AnnotatedMembersSearcher implements QueryExecutor() { + @Override + public String compute() { + return annClass.getQualifiedName(); + } + }); assert annotationFQN != null; final SearchScope scope = p.getScope(); @@ -92,44 +99,49 @@ public class AnnotatedMembersSearcher implements QueryExecutor candidates; if (scope instanceof GlobalSearchScope) { candidates = getAnnotatedMemberCandidates(annClass, ((GlobalSearchScope)scope)); - } else { + } + else { candidates = new ArrayList(); - for (PsiElement element : ((LocalSearchScope)scope).getScope()) { - if (element instanceof GroovyPsiElement) { - ((GroovyPsiElement)element).accept(new GroovyRecursiveElementVisitor() { - @Override - public void visitMethod(GrMethod method) { - candidates.add(method); - } + for (final PsiElement element : ((LocalSearchScope)scope).getScope()) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + if (element instanceof GroovyPsiElement) { + ((GroovyPsiElement)element).accept(new GroovyRecursiveElementVisitor() { + @Override + public void visitMethod(GrMethod method) { + candidates.add(method); + } - @Override - public void visitField(GrField field) { - candidates.add(field); + @Override + public void visitField(GrField field) { + candidates.add(field); + } + }); } - }); - } + } + }); } } - for (PsiModifierListOwner candidate : candidates) { - token = ReadAction.start(); - try { - if (!AnnotatedElementsSearcher.isInstanceof(candidate, p.getTypes())) { - continue; - } - - PsiModifierList list = candidate.getModifierList(); - if (list != null) { - for (PsiAnnotation annotation : list.getAnnotations()) { - if (annotationFQN.equals(annotation.getQualifiedName()) && !consumer.process(candidate)) { - return false; + for (final PsiModifierListOwner candidate : candidates) { + boolean accepted = ApplicationManager.getApplication().runReadAction(new Computable(){ + @Override + public Boolean compute() { + if (AnnotatedElementsSearcher.isInstanceof(candidate, p.getTypes())) { + PsiModifierList list = candidate.getModifierList(); + if (list != null) { + for (PsiAnnotation annotation : list.getAnnotations()) { + if (annotationFQN.equals(annotation.getQualifiedName()) && !consumer.process(candidate)) { + return false; + } + } } } + return true; } - } - finally { - token.finish(); - } + }); + if (!accepted) return false; } return true; From 81b47cefd9691ff5342d18656290c2dfc13ab291 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 22 Aug 2014 14:33:52 +0400 Subject: [PATCH 09/97] read action --- .../internal/StaticIconFieldsAction.java | 33 +++++++++++++++---- .../duplicates/MethodDuplicatesHandler.java | 20 +++++++---- .../intellij/slicer/SliceLeafAnalyzer.java | 27 +++++++-------- .../slicer/SliceNullnessAnalyzer.java | 13 +++++--- .../ConvertParameterToMapEntryIntention.java | 31 +++++++++++++---- 5 files changed, 86 insertions(+), 38 deletions(-) diff --git a/java/java-impl/src/com/intellij/internal/StaticIconFieldsAction.java b/java/java-impl/src/com/intellij/internal/StaticIconFieldsAction.java index 2864db6608e6..7fae15f159b7 100644 --- a/java/java-impl/src/com/intellij/internal/StaticIconFieldsAction.java +++ b/java/java-impl/src/com/intellij/internal/StaticIconFieldsAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,10 +22,12 @@ package com.intellij.internal; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Computable; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.ReferencesSearch; @@ -49,19 +51,36 @@ public class StaticIconFieldsAction extends AnAction { ProgressManager.getInstance().run(new Task.Backgroundable(project, "Searching icons usages") { @Override public void run(@NotNull ProgressIndicator indicator) { - JavaPsiFacade facade = JavaPsiFacade.getInstance(project); - GlobalSearchScope all = GlobalSearchScope.allScope(project); - PsiClass allIcons = facade.findClass("com.intellij.icons.AllIcons", all); + final JavaPsiFacade facade = JavaPsiFacade.getInstance(project); + final GlobalSearchScope all = GlobalSearchScope.allScope(project); + PsiClass allIcons = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public PsiClass compute() { + return facade.findClass("com.intellij.icons.AllIcons", all); + } + }); searchFields(allIcons, view, indicator); - for (PsiClass iconsClass : facade.findPackage("icons").getClasses(all)) { + PsiClass[] classes = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public PsiClass[] compute() { + return facade.findPackage("icons").getClasses(all); + } + }); + for (PsiClass iconsClass : classes) { searchFields(iconsClass, view, indicator); } } }); } - private static void searchFields(PsiClass allIcons, final UsageView view, ProgressIndicator indicator) { - indicator.setText("Searching for: " + allIcons.getQualifiedName()); + private static void searchFields(final PsiClass allIcons, final UsageView view, final ProgressIndicator indicator) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + indicator.setText("Searching for: " + allIcons.getQualifiedName()); + } + }); + ReferencesSearch.search(allIcons).forEach(new Processor() { @Override public boolean process(PsiReference reference) { diff --git a/java/java-impl/src/com/intellij/refactoring/util/duplicates/MethodDuplicatesHandler.java b/java/java-impl/src/com/intellij/refactoring/util/duplicates/MethodDuplicatesHandler.java index 876617b516e4..4bd3d6db70a5 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/duplicates/MethodDuplicatesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/util/duplicates/MethodDuplicatesHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,13 +28,14 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleUtil; +import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectUtil; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.WindowManager; import com.intellij.psi.*; @@ -71,7 +72,7 @@ public class MethodDuplicatesHandler implements RefactoringActionHandler { } final AnalysisScope scope = new AnalysisScope(file); - final Module module = ModuleUtil.findModuleForPsiElement(file); + final Module module = ModuleUtilCore.findModuleForPsiElement(file); final BaseAnalysisActionDialog dlg = new BaseAnalysisActionDialog(RefactoringBundle.message("replace.method.duplicates.scope.chooser.title", REFACTORING_NAME), RefactoringBundle.message("replace.method.duplicates.scope.chooser.message"), project, scope, module != null ? module.getName() : null, false, @@ -134,13 +135,18 @@ public class MethodDuplicatesHandler implements RefactoringActionHandler { } final Map> memberWithModulesMap = new HashMap>(); - for (PsiMember member : members) { - final Module module = ModuleUtil.findModuleForPsiElement(member); + for (final PsiMember member : members) { + final Module module = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public Module compute() { + return ModuleUtilCore.findModuleForPsiElement(member); + } + }); if (module != null) { final HashSet dependencies = new HashSet(); ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { - ModuleUtil.collectModulesDependsOn(module, dependencies); + ModuleUtilCore.collectModulesDependsOn(module, dependencies); } }); memberWithModulesMap.put(member, dependencies); @@ -158,7 +164,7 @@ public class MethodDuplicatesHandler implements RefactoringActionHandler { progressIndicator.setText2(ProjectUtil.calcRelativeToProjectPath(virtualFile, project)); } } - final Module targetModule = ModuleUtil.findModuleForPsiElement(file); + final Module targetModule = ModuleUtilCore.findModuleForPsiElement(file); if (targetModule == null) return; for (Map.Entry> entry : memberWithModulesMap.entrySet()) { final Set dependencies = entry.getValue(); diff --git a/java/java-impl/src/com/intellij/slicer/SliceLeafAnalyzer.java b/java/java-impl/src/com/intellij/slicer/SliceLeafAnalyzer.java index d59129174520..a08464fbd7ce 100644 --- a/java/java-impl/src/com/intellij/slicer/SliceLeafAnalyzer.java +++ b/java/java-impl/src/com/intellij/slicer/SliceLeafAnalyzer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -244,7 +244,7 @@ public class SliceLeafAnalyzer { final SliceNodeGuide guide = new SliceNodeGuide(treeStructure); WalkingState walkingState = new WalkingState(guide) { @Override - public void visit(@NotNull SliceNode element) { + public void visit(@NotNull final SliceNode element) { element.calculateDupNode(); node(element, map).clear(); SliceNode duplicate = element.getDuplicate(); @@ -252,20 +252,21 @@ public class SliceLeafAnalyzer { node(element, map).addAll(node(duplicate, map)); } else { - final SliceUsage sliceUsage = element.getValue(); + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + final SliceUsage sliceUsage = element.getValue(); - Collection children = element.getChildren(); - if (children.isEmpty()) { - PsiElement value = ApplicationManager.getApplication().runReadAction(new Computable() { - @Override - public PsiElement compute() { - return sliceUsage.indexNesting == 0 ? sliceUsage.getElement() : null; + Collection children = element.getChildren(); + if (children.isEmpty()) { + PsiElement value = sliceUsage.indexNesting == 0 ? sliceUsage.getElement() : null; + if (value != null) { + node(element, map).addAll(ContainerUtil.singleton(value, LEAF_ELEMENT_EQUALITY)); + } } - }); - if (value != null) { - node(element, map).addAll(ContainerUtil.singleton(value, LEAF_ELEMENT_EQUALITY)); } - } + }); + super.visit(element); } } diff --git a/java/java-impl/src/com/intellij/slicer/SliceNullnessAnalyzer.java b/java/java-impl/src/com/intellij/slicer/SliceNullnessAnalyzer.java index b65932aeaa81..ba6f8602ba46 100644 --- a/java/java-impl/src/com/intellij/slicer/SliceNullnessAnalyzer.java +++ b/java/java-impl/src/com/intellij/slicer/SliceNullnessAnalyzer.java @@ -170,7 +170,7 @@ public class SliceNullnessAnalyzer { final SliceLeafAnalyzer.SliceNodeGuide guide = new SliceLeafAnalyzer.SliceNodeGuide(treeStructure); WalkingState walkingState = new WalkingState(guide) { @Override - public void visit(@NotNull SliceNode element) { + public void visit(@NotNull final SliceNode element) { element.calculateDupNode(); node(element, map).clear(); SliceNode duplicate = element.getDuplicate(); @@ -178,11 +178,10 @@ public class SliceNullnessAnalyzer { node(element, map).add(node(duplicate, map)); } else { - final SliceUsage sliceUsage = element.getValue(); final PsiElement value = ApplicationManager.getApplication().runReadAction(new Computable() { @Override public PsiElement compute() { - return sliceUsage.getElement(); + return element.getValue().getElement(); } }); Nullness nullness = ApplicationManager.getApplication().runReadAction(new Computable() { @@ -198,7 +197,13 @@ public class SliceNullnessAnalyzer { group(element, map, NullAnalysisResult.NOT_NULLS).add(value); } else { - Collection children = element.getChildren(); + Collection children = ApplicationManager.getApplication().runReadAction( + new Computable>() { + @Override + public Collection compute() { + return element.getChildren(); + } + }); if (children.isEmpty()) { group(element, map, NullAnalysisResult.UNKNOWNS).add(value); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java index 318db55df11b..befb360e5885 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/style/parameterToEntry/ConvertParameterToMapEntryIntention.java @@ -23,6 +23,7 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; @@ -459,17 +460,33 @@ public class ConvertParameterToMapEntryIntention extends Intention { } }; ReferencesSearch.search(namedElem).forEach(consumer); - if (namedElem instanceof GrField && ((GrField)namedElem).isProperty()) { - final GrAccessorMethod[] getters = ((GrField)namedElem).getGetters(); + boolean isProperty = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public Boolean compute() { + return namedElem instanceof GrField && ((GrField)namedElem).isProperty(); + } + }); + if (isProperty) { + final GrAccessorMethod[] getters = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public GrAccessorMethod[] compute() { + return ((GrField)namedElem).getGetters(); + } + }); for (GrAccessorMethod getter : getters) { MethodReferencesSearch.search(getter).forEach(consumer); } } - for (PsiReference reference : references) { - final PsiElement element = reference.getElement(); - if (element != null) { - occurrences.add(element); - } + for (final PsiReference reference : references) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + final PsiElement element = reference.getElement(); + if (element != null) { + occurrences.add(element); + } + } + }); } } From 6f123050a023959bf9da5b7eea83f0f700685137 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 22 Aug 2014 14:53:53 +0400 Subject: [PATCH 10/97] wait for reformat to finish --- .../com/intellij/codeInsight/GenerateGetterSetterTest.groovy | 4 +++- .../lang/actions/generate/GroovyGenerateMembersTest.groovy | 4 +++- .../jetbrains/plugins/javaFX/GenerateGetterSetterTest.java | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/GenerateGetterSetterTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/GenerateGetterSetterTest.groovy index 273ab150d8c5..4aabc1448492 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/GenerateGetterSetterTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/GenerateGetterSetterTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import com.intellij.util.ui.UIUtil import com.siyeh.ig.style.UnqualifiedFieldAccessInspection import org.jetbrains.annotations.Nullable /** @@ -103,5 +104,6 @@ class Foo { } }.invoke(project, myFixture.editor, myFixture.file) }) + UIUtil.dispatchAllInvocationEvents() } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/actions/generate/GroovyGenerateMembersTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/actions/generate/GroovyGenerateMembersTest.groovy index 9cc93a625c7c..53965939d7e1 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/actions/generate/GroovyGenerateMembersTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/actions/generate/GroovyGenerateMembersTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ import com.intellij.psi.PsiClass import com.intellij.psi.PsiFile import com.intellij.psi.impl.source.PostprocessReformattingAspect import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import com.intellij.util.ui.UIUtil import org.jetbrains.annotations.Nullable import org.jetbrains.plugins.groovy.actions.generate.accessors.GroovyGenerateGetterSetterAction import org.jetbrains.plugins.groovy.actions.generate.constructors.GroovyGenerateConstructorHandler @@ -382,6 +383,7 @@ class GrImportStatementStub { return members } }.invoke(project, myFixture.editor, myFixture.file); + UIUtil.dispatchAllInvocationEvents() PostprocessReformattingAspect.getInstance(project).doPostponedFormatting() } }.execute() diff --git a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/GenerateGetterSetterTest.java b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/GenerateGetterSetterTest.java index 8be55aba835a..3c41bf68379a 100644 --- a/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/GenerateGetterSetterTest.java +++ b/plugins/javaFX/javaFX-CE/testSrc/org/jetbrains/plugins/javaFX/GenerateGetterSetterTest.java @@ -23,6 +23,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.testFramework.PlatformTestCase; import com.intellij.testFramework.PsiTestUtil; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -55,6 +56,7 @@ public class GenerateGetterSetterTest extends DaemonAnalyzerTestCase { return members; } }.invoke(getProject(), getEditor(), getFile()); + UIUtil.dispatchAllInvocationEvents(); checkResultByFile("/generateGetterSetter/after" + getTestName(false) + ".java"); } From ca9064ec067365f6b6f0dbfeaee6432d8f510685 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 22 Aug 2014 16:24:01 +0400 Subject: [PATCH 11/97] debugger: read action --- .../com/intellij/debugger/SourcePosition.java | 80 +++++++++++-------- .../intellij/debugger/DebuggerTestCase.java | 11 +-- 2 files changed, 51 insertions(+), 40 deletions(-) diff --git a/java/debugger/openapi/src/com/intellij/debugger/SourcePosition.java b/java/debugger/openapi/src/com/intellij/debugger/SourcePosition.java index 9028b1489970..fcafd6440fbf 100644 --- a/java/debugger/openapi/src/com/intellij/debugger/SourcePosition.java +++ b/java/debugger/openapi/src/com/intellij/debugger/SourcePosition.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -128,7 +128,12 @@ public abstract class SourcePosition implements Navigatable{ return true; } final PsiElement psiElement = myPsiElement; - return psiElement != null && !psiElement.isValid(); + return psiElement != null && !ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public Boolean compute() { + return psiElement.isValid(); + } + }); } @Override @@ -194,7 +199,7 @@ public abstract class SourcePosition implements Navigatable{ @Nullable protected PsiElement calcPsiElement() { - PsiFile psiFile = getFile(); + final PsiFile psiFile = getFile(); int lineNumber = getLine(); if(lineNumber < 0) { return psiFile; @@ -207,47 +212,52 @@ public abstract class SourcePosition implements Navigatable{ if (lineNumber >= document.getLineCount()) { return psiFile; } - int startOffset = document.getLineStartOffset(lineNumber); + final int startOffset = document.getLineStartOffset(lineNumber); if(startOffset == -1) { return null; } - PsiElement rootElement = psiFile; + return ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public PsiElement compute() { + PsiElement rootElement = psiFile; - List allFiles = psiFile.getViewProvider().getAllFiles(); - if (allFiles.size() > 1) { // jsp & gsp - PsiClassOwner owner = ContainerUtil.findInstance(allFiles, PsiClassOwner.class); - if (owner != null) { - PsiClass[] classes = owner.getClasses(); - if (classes.length == 1 && classes[0] instanceof SyntheticElement) { - rootElement = classes[0]; + List allFiles = psiFile.getViewProvider().getAllFiles(); + if (allFiles.size() > 1) { // jsp & gsp + PsiClassOwner owner = ContainerUtil.findInstance(allFiles, PsiClassOwner.class); + if (owner != null) { + PsiClass[] classes = owner.getClasses(); + if (classes.length == 1 && classes[0] instanceof SyntheticElement) { + rootElement = classes[0]; + } + } } - } - } - PsiElement element; - while(true) { - final CharSequence charsSequence = document.getCharsSequence(); - for (; startOffset < charsSequence.length(); startOffset++) { - char c = charsSequence.charAt(startOffset); - if (c != ' ' && c != '\t') { - break; + PsiElement element; + int offset = startOffset; + while (true) { + final CharSequence charsSequence = document.getCharsSequence(); + for (; offset < charsSequence.length(); offset++) { + char c = charsSequence.charAt(startOffset); + if (c != ' ' && c != '\t') { + break; + } + } + element = rootElement.findElementAt(startOffset); + + if (element instanceof PsiComment) { + offset = element.getTextRange().getEndOffset() + 1; + } + else { + break; + } } + if (element != null && element.getParent() instanceof PsiForStatement) { + return ((PsiForStatement)element.getParent()).getInitialization(); + } + return element; } - element = rootElement.findElementAt(startOffset); - - if(element instanceof PsiComment) { - startOffset = element.getTextRange().getEndOffset() + 1; - } - else{ - break; - } - } - - if (element != null && element.getParent() instanceof PsiForStatement) { - return ((PsiForStatement)element.getParent()).getInitialization(); - } - return element; + }); } } diff --git a/java/testFramework/src/com/intellij/debugger/DebuggerTestCase.java b/java/testFramework/src/com/intellij/debugger/DebuggerTestCase.java index 2409104c7116..2ec9ae61e17b 100644 --- a/java/testFramework/src/com/intellij/debugger/DebuggerTestCase.java +++ b/java/testFramework/src/com/intellij/debugger/DebuggerTestCase.java @@ -51,6 +51,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiFile; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.ui.UIUtil; import com.intellij.xdebugger.XDebugProcess; @@ -328,15 +329,15 @@ public abstract class DebuggerTestCase extends ExecutionWithDebuggerToolsTestCas } protected void createBreakpoints(final String className) { - final PsiClass psiClass = ApplicationManager.getApplication().runReadAction(new Computable() { + final PsiFile psiFile = ApplicationManager.getApplication().runReadAction(new Computable() { @Override - public PsiClass compute() { - return JavaPsiFacade.getInstance(myProject).findClass(className, GlobalSearchScope.allScope(myProject)); + public PsiFile compute() { + PsiClass psiClass = JavaPsiFacade.getInstance(myProject).findClass(className, GlobalSearchScope.allScope(myProject)); + return psiClass.getContainingFile(); } }); - createBreakpoints(psiClass.getContainingFile()); - + createBreakpoints(psiFile); } protected EvaluationContextImpl createEvaluationContext(final SuspendContextImpl suspendContext) { From 2956ef8365b7920160fd65ac9690c81a55a49f41 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 22 Aug 2014 16:39:51 +0400 Subject: [PATCH 12/97] commit documents in tests --- .../testSrc/com/intellij/project/LoadProjectTest.java | 7 ++++++- .../src/com/intellij/codeInsight/CodeInsightTestCase.java | 2 ++ .../fixtures/impl/CodeInsightTestFixtureImpl.java | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/java/java-tests/testSrc/com/intellij/project/LoadProjectTest.java b/java/java-tests/testSrc/com/intellij/project/LoadProjectTest.java index b50e2d87c71f..69cc43416b5b 100644 --- a/java/java-tests/testSrc/com/intellij/project/LoadProjectTest.java +++ b/java/java-tests/testSrc/com/intellij/project/LoadProjectTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ import com.intellij.openapi.project.impl.ProjectImpl; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.PsiFileImpl; import com.intellij.testFramework.LeakHunter; @@ -61,6 +62,8 @@ public class LoadProjectTest extends PlatformTestCase { assertNotNull(fileA); fileA.navigate(true); Editor editorA = FileEditorManager.getInstance(getProject()).openTextEditor(new OpenFileDescriptor(getProject(), a), true); + PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); + assertNotNull(editorA); CodeInsightTestFixtureImpl.instantiateAndRun(fileA, editorA, new int[0], false); @@ -70,6 +73,8 @@ public class LoadProjectTest extends PlatformTestCase { assertNotNull(fileB); fileB.navigate(true); Editor editorB = FileEditorManager.getInstance(getProject()).openTextEditor(new OpenFileDescriptor(getProject(), b), true); + PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); + assertNotNull(editorB); CodeInsightTestFixtureImpl.instantiateAndRun(fileB, editorB, new int[0], false); diff --git a/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCase.java b/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCase.java index 6ecec97f7fe7..631738835371 100644 --- a/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCase.java +++ b/java/testFramework/src/com/intellij/codeInsight/CodeInsightTestCase.java @@ -77,6 +77,8 @@ public abstract class CodeInsightTestCase extends PsiTestCase { Editor editor = instance.openTextEditor(new OpenFileDescriptor(myProject, file, 0), false); ((EditorImpl)editor).setCaretActive(); + PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); + return editor; } diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java index e16d065eb7e0..8aafb17da1de 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -1425,6 +1425,8 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig module.getMessageBus().syncPublisher(FacetManager.FACETS_TOPIC).facetConfigurationChanged(facet); } } + PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); + if (myCaresAboutInjection) { setupEditorForInjectedLanguage(); } From b201266a88b4ae3f288dfbbef2ac72cfa694139d Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 22 Aug 2014 17:57:22 +0400 Subject: [PATCH 13/97] cleanup --- .../ide/util/treeView/AbstractTreeUi.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index 202483d0117b..0cae4560b402 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -687,7 +687,7 @@ public class AbstractTreeUi { wasCleanedUp = true; } - if (myRootNodeWasQueuedToInitialize) return wasCleanedUp; + if (myRootNodeWasQueuedToInitialize) return true; myRootNodeWasQueuedToInitialize = true; @@ -3778,7 +3778,7 @@ public class AbstractTreeUi { final boolean oldCanProcessDeferredSelection = myCanProcessDeferredSelections; - if (!deferred && wasRootNodeInitialized() && willAffectSelection) { + if (!deferred && wasRootNodeInitialized()) { _getReady().doWhenDone(new Runnable() { @Override public void run() { @@ -4357,12 +4357,13 @@ public class AbstractTreeUi { Object eachElement = element; DefaultMutableTreeNode firstVisible = null; while (true) { - if (!isValid(eachElement) || eachElement == null) break; + if (eachElement == null || !isValid(eachElement)) break; final int preselected = getRowIfUnderSelection(eachElement); if (preselected >= 0) { firstVisible = (DefaultMutableTreeNode)getTree().getPathForRow(preselected).getLastPathComponent(); - } else { + } + else { firstVisible = getNodeForElement(eachElement, true); } @@ -4371,15 +4372,20 @@ public class AbstractTreeUi { kidsToExpand.add(eachElement); } if (firstVisible != null) break; - eachElement = eachElement != null ? getTreeStructure().getParentElement(eachElement) : null; + eachElement = getTreeStructure().getParentElement(eachElement); if (eachElement == null) { firstVisible = null; break; } - if (kidsToExpand.contains(eachElement)) { + int i = kidsToExpand.indexOf(eachElement); + if (i != -1) { try { - LOG.error("Tree path contains equal elements at different levels: element=" + eachElement + " class=" + eachElement.getClass() + " path=" + kidsToExpand + " tree structure=" + myTreeStructure); + Object existing = kidsToExpand.get(i); + LOG.error("Tree path contains equal elements at different levels:\n" + + " element: '" + eachElement + "'; " + eachElement.getClass() + " ("+System.identityHashCode(eachElement)+");\n" + + "existing: '" + existing + "'; " + existing.getClass()+ " ("+System.identityHashCode(existing)+"); " + + "path='" + kidsToExpand + "'; tree structure=" + myTreeStructure); } catch (AssertionError ignored) { } @@ -5044,6 +5050,7 @@ public class AbstractTreeUi { return myUpdateChildren; } + @Override @NotNull @NonNls public synchronized String toString() { From cddb607f3b195efa9246afd4b6ee8d011ad45821 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 22 Aug 2014 18:06:11 +0400 Subject: [PATCH 14/97] map is unnecessary --- .../ide/util/treeView/AbstractTreeUi.java | 49 +++++++++---------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index 0cae4560b402..10285d05fbee 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -83,7 +83,7 @@ public class AbstractTreeUi { } }; long myOwnComparatorStamp; - long myLastComparatorStamp; + private long myLastComparatorStamp; private DefaultMutableTreeNode myRootNode; private final Map myElementToNodeMap = new HashMap(); @@ -109,7 +109,7 @@ public class AbstractTreeUi { private final Map> myNodeChildrenActions = new HashMap>(); private long myClearOnHideDelay = -1; - private final Map ourUi2Countdown = Collections.synchronizedMap(new WeakHashMap()); + private volatile long ourUi2Countdown; private final Set myDeferredSelections = new HashSet(); private final Set myDeferredExpansions = new HashSet(); @@ -263,7 +263,7 @@ public class AbstractTreeUi { } - boolean isNodeActionsPending() { + private boolean isNodeActionsPending() { return !myNodeActions.isEmpty() || !myNodeChildrenActions.isEmpty(); } @@ -310,28 +310,23 @@ public class AbstractTreeUi { private void cleanUpAll() { final long now = System.currentTimeMillis(); - final AbstractTreeUi[] uis = ourUi2Countdown.keySet().toArray(new AbstractTreeUi[ourUi2Countdown.size()]); - for (AbstractTreeUi eachUi : uis) { - if (eachUi == null) continue; - final Long timeToCleanup = ourUi2Countdown.get(eachUi); - if (timeToCleanup == null) continue; - if (now >= timeToCleanup.longValue()) { - ourUi2Countdown.remove(eachUi); - Runnable runnable = new Runnable() { - @Override - public void run() { - if (!canInitiateNewActivity()) return; + final long timeToCleanup = ourUi2Countdown; + if (timeToCleanup != 0 && now >= timeToCleanup) { + ourUi2Countdown = 0; + Runnable runnable = new Runnable() { + @Override + public void run() { + if (!canInitiateNewActivity()) return; - myCleanupTask = null; - getBuilder().cleanUp(); - } - }; - if (isPassthroughMode()) { - runnable.run(); - } - else { - invokeLaterIfNeeded(false, runnable); + myCleanupTask = null; + getBuilder().cleanUp(); } + }; + if (isPassthroughMode()) { + runnable.run(); + } + else { + invokeLaterIfNeeded(false, runnable); } } } @@ -390,7 +385,7 @@ public class AbstractTreeUi { cancelCurrentCleanupTask(); myCanProcessDeferredSelections = true; - ourUi2Countdown.remove(this); + ourUi2Countdown = 0; if (!myWasEverShown || myUpdateFromRootRequested || myUpdateIfInactive) { getBuilder().updateFromRoot(); @@ -408,7 +403,7 @@ public class AbstractTreeUi { } } - public void deactivate() { + void deactivate() { getUpdater().hideNotify(); myBusyAlarm.cancelAllRequests(); @@ -420,7 +415,7 @@ public class AbstractTreeUi { } if (getClearOnHideDelay() >= 0) { - ourUi2Countdown.put(this, System.currentTimeMillis() + getClearOnHideDelay()); + ourUi2Countdown = System.currentTimeMillis() + getClearOnHideDelay(); scheduleCleanUpAll(); } } @@ -2878,7 +2873,7 @@ public class AbstractTreeUi { if (!getBuilder().isSmartExpand()) return false; boolean smartExpand = !myNotForSmartExpand.contains(node) && canSmartExpand; - return smartExpand && validateAutoExpand(smartExpand, getElementFor(node)); + return smartExpand && validateAutoExpand(true, getElementFor(node)); } private void processSmartExpand(@NotNull final DefaultMutableTreeNode node, final boolean canSmartExpand, boolean forced) { From 8cf47b826e7825e6437bfb4d150aef1b38ac1e8c Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 22 Aug 2014 18:58:20 +0400 Subject: [PATCH 15/97] illegal text range exception --- .../openapi/editor/impl/EditorMarkupModelImpl.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java index 20c08ec4ec99..1df027a8cfb0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java @@ -1056,29 +1056,30 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark int startLineNumber = end == -1 ? 0 : offsetToLine(start, document); int startY; int lineCount; - if (myEditorSourceHeight < myEditorTargetHeight) { + int editorTargetHeight = Math.max(0, myEditorTargetHeight); + if (myEditorSourceHeight < editorTargetHeight) { lineCount = 0; startY = myEditorScrollbarTop + startLineNumber * myEditor.getLineHeight(); } else { lineCount = myEditorSourceHeight / myEditor.getLineHeight(); - startY = myEditorScrollbarTop + (int)((float)startLineNumber / lineCount * myEditorTargetHeight); + startY = myEditorScrollbarTop + (int)((float)startLineNumber / lineCount * editorTargetHeight); } int endY; int endLineNumber = offsetToLine(end, document); if (end == -1 || start == -1) { - endY = Math.min(myEditorSourceHeight, myEditorTargetHeight); + endY = Math.min(myEditorSourceHeight, editorTargetHeight); } else if (start == end || offsetToLine(start, document) == endLineNumber) { endY = startY; // both offsets are on the same line, no need to recalc Y position } else { - if (myEditorSourceHeight < myEditorTargetHeight) { + if (myEditorSourceHeight < editorTargetHeight) { endY = myEditorScrollbarTop + endLineNumber * myEditor.getLineHeight(); } else { - endY = myEditorScrollbarTop + (int)((float)endLineNumber / lineCount * myEditorTargetHeight); + endY = myEditorScrollbarTop + (int)((float)endLineNumber / lineCount * editorTargetHeight); } } if (endY < startY) endY = startY; From b8f9f003fb234c8c4e345cd8c50185d3ddd17127 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 22 Aug 2014 18:59:14 +0400 Subject: [PATCH 16/97] make hasSomethingToCommit()/commit() pair consistent, SOE otherwise --- .../sm/runner/SMTRunnerTreeStructure.java | 14 +++++++------- .../treeView/smartTree/SmartTreeStructure.java | 11 ++++++----- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTRunnerTreeStructure.java b/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTRunnerTreeStructure.java index b740bb6a0ccc..7d15140c8de5 100644 --- a/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTRunnerTreeStructure.java +++ b/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTRunnerTreeStructure.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,6 +43,11 @@ public class SMTRunnerTreeStructure extends AbstractTreeStructure public void commit() { } + @Override + public boolean hasSomethingToCommit() { + return false; + } + @NotNull @Override public SMTRunnerNodeDescriptor createDescriptor(final Object element, @@ -70,17 +75,12 @@ public class SMTRunnerTreeStructure extends AbstractTreeStructure return ((AbstractTestProxy)element).getParent(); } + @Override public Object getRootElement() { return myRootNode; } - - @Override - public boolean hasSomethingToCommit() { - return false; - } - public void setFilter(final Filter nodesFilter) { myTestNodesFilter = nodesFilter; } diff --git a/platform/structure-view-impl/src/com/intellij/ide/util/treeView/smartTree/SmartTreeStructure.java b/platform/structure-view-impl/src/com/intellij/ide/util/treeView/smartTree/SmartTreeStructure.java index 478c160b8c14..be7eb5453638 100644 --- a/platform/structure-view-impl/src/com/intellij/ide/util/treeView/smartTree/SmartTreeStructure.java +++ b/platform/structure-view-impl/src/com/intellij/ide/util/treeView/smartTree/SmartTreeStructure.java @@ -36,6 +36,12 @@ public class SmartTreeStructure extends AbstractTreeStructure { @Override public void commit() { + PsiDocumentManager.getInstance(myProject).commitAllDocuments(); + } + + @Override + public boolean hasSomethingToCommit() { + return PsiDocumentManager.getInstance(myProject).hasUncommitedDocuments(); } @Override @@ -71,11 +77,6 @@ public class SmartTreeStructure extends AbstractTreeStructure { return ((AbstractTreeNode)element).isAlwaysLeaf(); } - @Override - public boolean hasSomethingToCommit() { - return PsiDocumentManager.getInstance(myProject).hasUncommitedDocuments(); - } - public void rebuildTree() { ((CachingChildrenTreeNode)getRootElement()).rebuildChildren(); } From 2cceb8621e86f97bfdc916af8cb359e45cf60f9f Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 25 Aug 2014 12:28:13 +0400 Subject: [PATCH 17/97] remove ambiguity from inspection results order --- .../codeInspection/javaDoc/JavaDocLocalInspectionBase.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/javaDoc/JavaDocLocalInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/javaDoc/JavaDocLocalInspectionBase.java index 5d6c4bcb59a1..36d7bc2f17ef 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/javaDoc/JavaDocLocalInspectionBase.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/javaDoc/JavaDocLocalInspectionBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -540,7 +540,7 @@ public class JavaDocLocalInspectionBase extends BaseJavaBatchLocalInspectionTool } if (required && superMethods.length == 0 && isTagRequired(psiMethod, "@throws") && psiMethod.getThrowsList().getReferencedTypes().length > 0) { - final Map declaredExceptions = new HashMap(); + final Map declaredExceptions = new LinkedHashMap(); final PsiClassType[] classTypes = psiMethod.getThrowsList().getReferencedTypes(); for (PsiClassType classType : classTypes) { final PsiClass psiClass = classType.resolve(); From 59d9c7606dead35655a3f2467c5a0269a743ac62 Mon Sep 17 00:00:00 2001 From: Denis Fokin Date: Mon, 25 Aug 2014 13:06:15 +0400 Subject: [PATCH 18/97] IDEA-128828 Reload project dialog is about twice longer than my screen width --- .../src/com/intellij/ui/messages/SheetController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/ui/messages/SheetController.java b/platform/platform-impl/src/com/intellij/ui/messages/SheetController.java index 2d76d6391ee8..bf0b37116941 100755 --- a/platform/platform-impl/src/com/intellij/ui/messages/SheetController.java +++ b/platform/platform-impl/src/com/intellij/ui/messages/SheetController.java @@ -70,6 +70,8 @@ public class SheetController { private static int GAP_BETWEEN_BUTTONS = 5; + private static String SPACE_OR_LINE_SEPARATOR_PATTERN = "[\\s" + System.getProperty("line.separator") + "]+"; + // SHEET public int SHEET_WIDTH = 400; @@ -289,7 +291,7 @@ public class SheetController { int widestWordWidth = 250; - String [] words = (message == null) ? ArrayUtil.EMPTY_STRING_ARRAY : message.split(" "); + String [] words = (message == null) ? ArrayUtil.EMPTY_STRING_ARRAY : message.split(SPACE_OR_LINE_SEPARATOR_PATTERN); for (String word : words) { widestWordWidth = Math.max(fontMetrics.stringWidth(word), widestWordWidth); From 57ea5884ffb3b91b9a0fefdfec101200bafc79bc Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 25 Aug 2014 11:19:00 +0200 Subject: [PATCH 19/97] IDEA-123836 Abnormal build process termination --- .../org/jetbrains/jps/cmdline/BuildMain.java | 42 +++++++++++++++---- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildMain.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildMain.java index c6b34ab97bed..8634769222a0 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildMain.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildMain.java @@ -74,7 +74,29 @@ public class BuildMain { final File systemDir = new File(FileUtil.toCanonicalPath(args[SYSTEM_DIR_ARG])); Utils.setSystemRoot(systemDir); - ourEventLoopGroup = new NioEventLoopGroup(1, SharedThreadPool.getInstance()); + // IDEA-123132, let's try again + for (int attempt = 0; attempt < 3; attempt++) { + try { + ourEventLoopGroup = new NioEventLoopGroup(1, SharedThreadPool.getInstance()); + break; + } + catch (IllegalStateException e) { + if (attempt == 2) { + printErrorAndExit(host, port, e); + return; + } + else { + LOG.warn("Cannot create event loop, attempt #" + attempt, e); + try { + //noinspection BusyWait + Thread.sleep(10 * (attempt + 1)); + } + catch (InterruptedException ignored) { + } + } + } + } + final Bootstrap bootstrap = new Bootstrap().group(ourEventLoopGroup).channel(NioSocketChannel.class).handler(new ChannelInitializer() { @Override protected void initChannel(Channel channel) throws Exception { @@ -92,17 +114,19 @@ public class BuildMain { future.channel().writeAndFlush(CmdlineProtoUtil.toMessage(sessionId, CmdlineProtoUtil.createParamRequest())); } else { - @SuppressWarnings("ThrowableResultOfMethodCallIgnored") - final Throwable reason = future.cause(); - System.err.println("Error connecting to " + host + ":" + port + "; reason: " + (reason != null? reason.getMessage() : "unknown")); - if (reason != null) { - reason.printStackTrace(System.err); - } - System.err.println("Exiting."); - System.exit(-1); + printErrorAndExit(host, port, future.cause()); } } + private static void printErrorAndExit(String host, int port, Throwable reason) { + System.err.println("Error connecting to " + host + ":" + port + "; reason: " + (reason != null ? reason.getMessage() : "unknown")); + if (reason != null) { + reason.printStackTrace(System.err); + } + System.err.println("Exiting."); + System.exit(-1); + } + private static class MyMessageHandler extends SimpleChannelInboundHandler { private final UUID mySessionId; private volatile BuildSession mySession; From 582a1311bfb4c54312ed01f54cc1cc7d9396e51c Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 25 Aug 2014 11:27:03 +0200 Subject: [PATCH 20/97] avoid warning "Warning:(168, 57) java: '_' used as an identifier (use of '_' as an identifier might not be supported in releases after Java SE 8)" --- .../src/com/intellij/ui/EditorNotificationsImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/ui/EditorNotificationsImpl.java b/platform/platform-impl/src/com/intellij/ui/EditorNotificationsImpl.java index 5721f4af4821..2197f7703769 100644 --- a/platform/platform-impl/src/com/intellij/ui/EditorNotificationsImpl.java +++ b/platform/platform-impl/src/com/intellij/ui/EditorNotificationsImpl.java @@ -165,7 +165,7 @@ public class EditorNotificationsImpl extends EditorNotifications { } @Override - public void onCanceled(@NotNull ProgressIndicator _) { + public void onCanceled(@NotNull ProgressIndicator ignored) { UIUtil.invokeLaterIfNeeded(new Runnable() { @Override public void run() { From eed53068171fc3ad0518c64154e6932119ae84cb Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 25 Aug 2014 11:49:08 +0200 Subject: [PATCH 21/97] update netty 4.1.0.Beta3 --- .idea/libraries/Netty.xml | 4 ++-- build/scripts/libLicenses.gant | 2 +- ....0.Beta1.jar => netty-all-4.1.0.Beta3.jar} | Bin 1997099 -> 2175247 bytes lib/required_for_dist.txt | 2 +- ....jar => netty-all-4.1.0.Beta3-sources.jar} | Bin 1646796 -> 1756376 bytes 5 files changed, 4 insertions(+), 4 deletions(-) rename lib/{netty-all-4.1.0.Beta1.jar => netty-all-4.1.0.Beta3.jar} (52%) rename lib/src/{netty-all-4.1.0.Beta1-sources.jar => netty-all-4.1.0.Beta3-sources.jar} (70%) diff --git a/.idea/libraries/Netty.xml b/.idea/libraries/Netty.xml index 723ad4eef42d..1c2042bff2df 100644 --- a/.idea/libraries/Netty.xml +++ b/.idea/libraries/Netty.xml @@ -1,11 +1,11 @@ - + - + \ No newline at end of file diff --git a/build/scripts/libLicenses.gant b/build/scripts/libLicenses.gant index 872cc5f6e9fe..5319444eaae6 100644 --- a/build/scripts/libLicenses.gant +++ b/build/scripts/libLicenses.gant @@ -252,7 +252,7 @@ libraryLicense(name: "XML-RPC", libraryName: "XmlRPC", version: "2.0", license: libraryLicense(name: "XStream", version: "1.4.3", license: "BSD", url: "http://xstream.codehaus.org/", licenseUrl: "http://xstream.codehaus.org/license.html") libraryLicense(name: "YourKit Java Profiler", libraryName: "yjp-controller-api-redist.jar", version: "8.0.x", license: "link (commercial license)", url: "http://yourkit.com/", licenseUrl: "http://www.yourkit.com/purchase/license.html") libraryLicense(name: "protobuf", version: "2.5.0", license: "New BSD", url: "http://code.google.com/p/protobuf/", licenseUrl: "http://code.google.com/p/protobuf/source/browse/trunk/COPYING.txt?r=367") -libraryLicense(name: "Netty", libraryName: "Netty", version: "4.1.0.Beta1", license: "Apache 2.0", url: "http://netty.io", licenseUrl: "http://www.apache.org/licenses/LICENSE-2.0") +libraryLicense(name: "Netty", libraryName: "Netty", version: "4.1.0.Beta3", license: "Apache 2.0", url: "http://netty.io", licenseUrl: "http://www.apache.org/licenses/LICENSE-2.0") libraryLicense(name: "Kryo", libraryName: "Kryo", version: "2.22", license: "New BSD License", url: "https://github.com/EsotericSoftware/kryo", licenseUrl: "https://github.com/EsotericSoftware/kryo/blob/master/license.txt") libraryLicense(name: "Snappy-Java", libraryName: "Snappy-Java", version: "0.3", license: "Apache 2.0", url: "https://github.com/dain/snappy", licenseUrl: "http://www.apache.org/licenses/LICENSE-2.0") libraryLicense(name: "Cucumber-Java", libraryName: "cucumber-java", version: "1.0.14", license: "MIT License", url: "https://github.com/cucumber/cucumber-jvm/", licenseUrl: "http://www.opensource.org/licenses/mit-license.html") diff --git a/lib/netty-all-4.1.0.Beta1.jar b/lib/netty-all-4.1.0.Beta3.jar similarity index 52% rename from lib/netty-all-4.1.0.Beta1.jar rename to lib/netty-all-4.1.0.Beta3.jar index cbd8b2cb6d339b713d016c905ec59eb6cdd600a4..fd2f6ba0e6c5514db3c7411b76f98f1e20bfcf8b 100644 GIT binary patch delta 779547 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 HrOQ zgs&W%_|+7kz)@Zler_SG5(ec~t|u_&j_Vud-v9FATvt%M*jvCoZHoN;B±!PJ{T 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 g`?l>H5kYBte4+U%DE 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

@hb!Bq+hPfh6QEW0%42*h)g{~* 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 z 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%0DQFSN)s# z?YrJG-vLRl!02bP`UBsM8$aGZMfYHN`;CvyQ5VcpSFY$Ao2#gRiNZ@=bl+yeWX_}1 zNvEHb4c}QNBzBTm&}WCFJ-H)=;H1GyueBOll=Lu~)nKvRb_cJr+Rwz&b2omp4-{Q2 zR{|eu?v{RK*5Z|pC%CgMKHxt&gFVk!xu&w7s{tyie(RupapkK!_BeCfI}amfaJ|?y zjc>JEy4MDq6+K}F%-k`7L&&KI4ple0ANx74R|c<1mbO?wKqiGJLZ4Sz2iyHH<#uEa zY22@fcOOy3&caz(Gb6xpX+4Z>-I3mS=W?ifB7ob545%OcprKo5B@^8Q9+l-7SUD8A zDyvyr!ZV8svTiM2np!t=&LFxahO4EDfhoywGFtS0jDL{;1RRJO9X#uuE|MsNX-#ii z79F(Lgs0<()VaXCO3nRB<)^HG1RLdwbep}ofQb9ChV))QW4~R|ws;_u&@Ij8S%*$0 zR%5hHbe?iJ=pQNwpGrYM{y>+?LEOOO1lBHYj>OPbgM_4gZ>*KOF zW!tbH)hZ(nC}*aFL@WwCfZjs4 zAffY=uaBDKm$0{#w1I{wTw*pMPX79%Cdr(gJigb_=ZJ?XQ=x5%9?vQ>a(E1eqSxKX za+)h}mOwKROQT2DxWd?E3104!X=!>G2FVcKh~x$+z+pVv;JkoRJhA1YlBsXu2fcH! z*YDg=g?CU#BYmyuD?LM(_LymyKmCNi&gm1d-crYXd!8jvd;Fap{W2u+m}bSBgDgJ0 z;kkm*997p(3TX)J;K9Lw6+8gIqc88O2QZS#)K~&J)k`EF)q00J8*NoB=CyWSoVqmvP@EL_axjl=XWBX9Bqd$>6qa=Nm4_Rvk8A2@L49W(ICVi){N+uJ4B zSPFrP?h^mA=ne}ib^iTH{!hQ_52f)x|H=P9tW&n&lvbo*glHH#n2?ZC9ugHSfx&lD zO%qm=*>Pam>{aMdJ$=XHHvBA>{_hmQA~&1t7yH}Ncfqe(M?cvKb41La>mD+kCwaei z-n6>EdpwM4e*pLn{oE2>3$S0SAv_;|K-OvL;a7hmALd`wxip#ypk!ZL8x6Pr`NWl6 z^rRP7Zdolx1cB3j~(L z(ra1$N>g^2ObPH27A;sKrd>d=p?|(ZuAeYE#(`{GOC1JhE#>=p*7lHpKNb~m2{4yu}@CK{03&6 z`w5|fvzkCur>@OUBp|9&362#-@xFbqQc~%GeLVCm^(EARw)ag??OPVaB0@1mzCQlT|qd$W;{tRaZ6(p>UzHDa|-*ju#w$rj#CE zYcE2lf@vO^kHryo-^_=`AP$8HUTn9*KACSzswMZD6A~OXf0(P17uycV*pjJY;&30K zNX3dg6u4vg3igZ}z1wXGfvLrZJRgvb?-LvY-Bi=ZKl&%`6QM@n( zV2ND>-FvumRj-46m4h?*WI6tgQ3O}xZj)^R^ZAWm9CwPh`CBXeh~Ir_BDdCn*QCn% zcd^cH`t3QY@wNzZ;R{2OV1!vSK*yWF?d&RRNK5A#s?3)L+|P3+#i(C)PT*<$m?p2N zG)TdSL@-2|Z>*}e2fGbRFm9Je7u{>70gThU<`$`*4NZq>7pwW4UW6h1nw2H#T8&)B z+pVfpVF!jE4~`0Nr^B}exYMS=@*pkQe#HLr6SyE42MAn{{9gLl9`2F{JAB3wFj;;d zFGX#hK4h?yP?*VFpqrC8O$Dw0t^G@t;Pdq&4ysO`KQD>rh#W__o|Z00umY*TM}S)` z1^|5Z)p}_)aREAV$+sEY5~t3|4#)KjM0HwqP;miKokW*`H=YfDQJn(*8`Y`s57p_B zR7ZXa)u)_7Uhy5uj;ipDU3-bo=IfD4hBoF|!XgyOi~nhSpncOO;&Z_#`OSP$Ewb)< z%4Igwdz%M&K=$c7*2F}OJpR3;lbja5XXA@^@EK)>pXaBEO$44v&+?I@MT?Zv&nw(+ zmzo#SxXVDMMV!-1dTKelQWj&3@v*Swtl|qut1arZ;}7G9MB_Wi4U8d*@PuIu$e7)z zbUR#{Ga&}C6-^9LtX6)Re*OG0gTgx9^37r55^xS=0E@h03bJS##UFgP@gyk9c_y|W z-{pCWd@w9+b7zwwv{x>PJIIE`7^4*-g?BN?5Wi-0xW`}_zvl(i(miZA{3Pk|@j!G= zp!jS)xSW=vUMqPIaRwHa^^jwcH!Bc^To|g&EYhzzE#}N=Ryak+5|Wof5r(->EH#6p zLAgbl3NXmQJ!6+CrT_l{%Nl4xS&mWh z3F7@@q4zaH+CE>K1$JdQk-PhHLt1M`TC3h}tzoyM^LlGL>_;+P6#BMRj%NsjBP@~^ z>gHYjJFl6-Pl?8^8uK|u*$S;V0QZEHSd4C)z?fOTm(-rf7 zF`4;ytp9)9-xPJF!30rx^UKQ{O)ayh!g(zPh3n?NAr(wXD@_k{M4yBxugaYU?@pE_ z=LGu+@Kd!|2SQ9Q@{F|~OmH6Pows%Hc7Cuh$`28xNi@hY%Cj;`B?Od!p?zgEIr*I2 zeR$YmLg5ZjC76s`&4RBMnJktnEa%;7B~qcxLXY$)Ap*8n&G5uH^6U#E-TGoVMceS; zTV9a091y2-Tbk*Q9Lhn*+9*O}6=dv`@J5+(V=>q)n6tH;Fc2gkX;Wub>>iTb?uJU? zsPn&^>4nEK)EXJ0S))5?m~R3yLJbeR`-Aw5*#Us=4j9)8-m_Mwhy(;onS(ax4qjfYFwR}U*)J>PV-)C(U%RtnJX09pT#_lkSdDCRB~tIY z^Ph2*s6X8VVWE?SU333A36D|SHXhKFiRnMhDE+r>p?{ym|J@c+`FkvVq{S6y4{snG zrX$BL2i1Y1MG~|vM1x?q!kFo&Ayuky`e$1RWW5(55+T-W{-=swmx45nI6>zrm+d|A z^8lpj&R?P@H$GHsDnjtsi914vgONefh%$zlLQxySiw=7xi<0zW8oRMZVAenMV4B}| z__HD~0z8FdvsJRo`jr&v(929k=db%|5d_C)dE>vOxZ}56Nx&G%<1I3JvyA)OKL0#%gO8302sVuxA;5aL6mnxZap%ovQJ6IcC6Oi zMcOm&Hd;upT>a{}Qdd0zekIb4=ckfs2U-()RMWnDTSDtoXLaXV6$Y(T7l*9zPk!YR znZ>k&*9%9Z`UDi&6v~ZF_R}UrX$=R5db5R@V2=AR#h+U?JUPCOCbt|uW?&?Y&`h`E7w`ugn8mq%h{3a7 z)mV*U=H}=plZfRZO6eh;>I&5*9?i1&1XvTl%^lofg(_(yQ~u9LB1=;`!VMd9kX zdc$jf_Y}u#TFeIqw#FqBx$=E~(syMs&}0q-?C%yGX<>Ixwa-O zd%&gaBVeQev~;dGNC1!vJM$dd;C_5U5zhQV4C?nMPGhfU`$t-$2*ok%$FE8t6%~Qe zJh~Ym9d-Gfo?NXr@8CGkj;6*M!j1+xnwUMcc0fsV5V$Z4KElR=xL_EoBsy2%YWyE4 z{=}&lgc?X)P@MAor#SWhiuM17!Om111sTGk^3E2?;^faiLt(frx=l;Kwv@m$ZVu!b zk-S)P73MR3^F)2oY(dg_{OFh9ff7y>Qmy&dTVamCJV_rd|6yf`#u!N&ibchh=0wAg z;(SzK02=ggXHjo%-?PqXS&0(pErTbxurQ3TF>Ss@)ONlJS#Kpa{(jX*ww zQZ-1|U`;4x-tb__7Pc}q%3|mhDk^CM`*Q>iPwZCQpd&E+ha>p#A^C<18t1Q$>wlAI z|HB(j9!LGlTU7h~iWzv-XQ)O1n&Hz*ySkKtuxc`D3&bfVp3H%iNjOLann}b%B}=FZm0GnH zT1j0(AcT3=>;*r=`O+`F)g$c6iL6;Bugrz^U+x22d4^YZwH`I*cV}-o$rutg>FH*U zgEVJ$wii_xBWU#^15U#g=Lv4s^R|F`g*A!_RhfVSdzv{nwgPk8^om-o1_RB#bk!&n z+2?AcqMu&5O3bjc4XfrK(fEF>f)|t5B+O4H2vEj_cWLzBWgKtj9J#oknx)f}jkVoX zc6l{AE%N<{Y&<)|QR_VMdhz@%1FyzK+p62tN|$_jLXqXWdAa;E!h@C^j&)a|+g4WCxYCWm`oXK&=-a}^} z8QbhJGIjovlnPA!S7QVa(Lov@jIR3m!bq#vo1>cW8|tddXOy<|UDL2+7A3HJa&Huv zh84VMB(pnXUwhUIu1dcw`u&uKrAF`eS4(g=ChGn|IUKO|4zEPLYsY7Yl5)!d=$MS# zy#)H%jYFC2n_c0c>4;am*D!aocj@L0?Ef zOFT}&Ngl}y;X61OIT+nc86HTw`;bhADr#}|Lj}%3c<$~OXA@+kKj9tcFLH_v30>35{Dl=X3#3fjy(TvTAK79yxNh;_`9+u8M0E0J*@4)?` z*R4v0U6=y7!szom#94>i>X0;#3jKSEhoGhf*<~o=0>LoLcPEI`MRt$5=qt=?@90fs zpMB_e0uU|dJ#a>%FYu~5%V3w0r8G-Q6-Rvo>ZTatqN<~} zwPFX3($$28z~&5t8L54Q9Tg=(3I@SgvCI}yHG?dWojdjQZsN*#_DB(@gZjftA5+R+ zlU~26kaDhje{^J2N(?^YTX*ho?s$84nS8x^pzr($uozrqN^=nGqeez%qH<6ast+nb z1S8mv3lYScZ|+JXgzc^997{vOLZ(yO@oXDOQ^b;tV6@I)ML{MrJ+7`fqBPS@WQ<%i zX^XOEGP_=I#iBCP%&#?+0!DF~jn`uySz$JJ@1u*P5TQe=nCh-e7C=Bi*_TLLjj2>V zY0NkS;H^8f{Yz+z2Gp2Z{87FE@#zUHjt3jt@tP zVNT^&tHgB&+)7Z86Nnk><``!Io)lS_Sy*AwdR+WeIYuqX7Ppv5TbU>hq^~5=XGMNY zLV2EnA-70UT~&g;Gr{%Y^)1Xr6KP!9EtRE!{h(t^8=aI}Z_8dZ2P>Rm@jFoe>dxYb zRZ@N)9XJP%IMC22vIGXz^FC{|(mTGo5z7UZxNNH5oXTdNY{%%ccBXrE`|C8r{~ONG zgxSG9h47Xxdp^MgI^Kir5xKze^jOa?CH%l)N$wMiXa8;$1UvNV$SY+Bu-{+^)y{Z; ziM0I?TaB#q4E=@M2=gWMezSh-(r_+t69`;wXc8IaZ1wSG=4{-F7{l*oXBCM~!sJ4{xu#xR^4Waz!)rQ__!CqdQ8l0{sfY<0%~nz% zMY^RRHJUVj?%JoO?CV_c{A96>4__DxY`s=M0Z*uTVkemP#i)x2Bek4efs4D&t$1F<$h96 z>AYx?ra#pkr@z2Fwp4Q-sVv`=zoleGoH!)o(x*%*?!Hdzc2AWlFg`u+bKksELJc0( zo-%}L(BEE44{fIZ@ux_p5-uD-{(&#DjiuTfQXP=edqdq>#_ckF?(M_sYdP;2P8~N8 z&-~qLDcjsAwkgS-vPB8lyH&ZNB$QDgZ-wG}O^sxr{!#Oz8_p%47Urz3z;8ddu+rqi zul{zBR;wQgVfYO{a@Ro-K66{)=NVCLYJYoIly+1Z7OU)6M8kpny&;4Ecn05g=eYjz zfB1Um=)8k%eLQJwTa9howrwYkt-g(I+qTi5abw%Ioiyq1?YZ~<&gr?|d)E5=k+m|< z=v}jCX3w*qJv%R|rdVB{j_(ehgm2@#+#aGIOERNAFQKDR&pZ1H;;()l4*p(Q_FakY z7qL1&r@nUk+?=o{@*}H*J5y@2aX{h_AKac95m*)ea;+AtH!QcwJZtUf&#C2iQ)*v~ z-1EKsxyM#^GMJGzAGNoE{r<=CF6fLzD;9Vm+W!yay43&4yzoCJ{=b8j#O+NT z%*>ttJ4{_2_$nri&YwLX$ASZXV=Jt;gu%WahyveXtA$QNgZsm|Os!loG2efNDKYz` ze)sqFpx|f5w>}+mb)Dw3?#tMQ$H#G@Ww+#Q(bvcIOP?$5Rz;7GkNXcKkVGvN=5GLM zZaq~;eQ{u*<_)VoRau3UsZK8=4a@9gnbN_ez`B~F>}ok3LL=-UHVd5W(CE2}UCxg8 zhPzuR+>Oc>Q}zPplk1rNLCWR#MVFq!p0eYREOpHGtIRXs&G<2cWMUvcq$SN*>Tnnr zz8v=j=k=_mKQ&;2;z?uNB9brAZ3)1l3(P@v;BhV&j<9CQWvzqh5P2ZPw(&zd+BQzm z5Ma^G^pJ8=bv8C(xsJL}PpM`zXPAm3sB3o28f49H$hPJL;nq#6x>mDCTZW=XNMdPq z^gW4w_xw7=Ao9Gc42*pVrIWM*s)^!U7T#-X)1t0LLifl3RsgF?-P|D|}(J2OAP6B9zNEWbY06d{YY|(pBHvj=SE< zr^b=KbzwV4@dkeB*0ihac&BGiN;WYx)TSK0?wwrpm~c6?Z%1!64H?ITf7(wWTGK$eAUn zuV^cFcd2!R-jNj<{SW}dFkU{MKJ`Q7l|3d!fJFZ*lsTN`NMbl2&aGK%+#ATl4Wcu^ z{>m7e0$m6NRz|H|PHl);hM#7~Cae;fe5+r5D7FoGmjSJB2H7p0ORvBeWpRI-xj52o zo5Q#Z-<16)<=g?R_@`ttrBwhPUqh{peXR}ROPdX%X%i*NB&?qCg1s)wfaw!DW022h z>L-+gLWh|if*keMq;pehIzx)t+0!=ET8*Cu#kn$fFzZA6#pnNsN3>+A*^2=l;%xs# zK=*%1d;h;**zC;y&E=tP_b2i2S9{cDGi|W~Az@KcOn8_!Xwarz**;lmI4hU{f1U5r zm|836LlYsVL?@w-wwABOM0M4@<=Lmof5?9qxV&`VF_- zip-2;PB+Pk6)*nMl=F3slkg4#%{jeD#mhH6%WJz;0C_4g*OS!RqMB+W$9&Tn_9EmK z?JD9$J$nDj{Kmy|{|fI(aqz&e`~HQKLEbr4_?%`k(Y+vJoJ;wTnV%yl_l&AJ(kv!c z>8x~q`FcN3ClgZG-C{;3tq&Uxv46Ec&K}w0s@eSlZ^wL4nQ4*XSzvnu#YS>T+^x&B z=51xK1zK8ZHs{GK`oE3KU>{g&I} zYbDQJiDwur)51d1LfDR*`T!;ds^ea9m@`<8I_h4fYiQkhBM1suSh_FNb?wjKU9b_J zRe&F$fYi;<8)9=4O3jDZ>pZ~2*V-guxQC<$w0k8j-W4=FN zKKo=KO)W9Z92(f?cZOZlUBT;)@bhMv>IVP`Pg!+wuwMF-*9DG8L`2acVy%ht=vc>% za))bm4riF5D1x2i>C9dbmcPgLz+1~i09{*_FcwzxI1#0QF&Rl%V6h0|#Vj&8By*8L zpsPvdbDv|lSx}CBVrZxafNiMryU~=?Q(kTn-R4vLJGq#&ZS5*?2&j-19}?OOq%C0P zqr^%;2X02+)5Kx=7wV?mbZcaYCRptZ@AaqXt-?3*qH)=0*6+~pYM-GprPT7y3trTZ zp}<9YRRuqWsnmpJukZbp*&gw$XZ(+#B}Av3LPQ^7fA%X$#h?Z;2XHDB8 zaZZa9ZUp7a1k;p(;uiGeyOmDb6nb(~&eEs{>gY(6OV~`hupenSBX&!m85(S#Bd(P% zc}Hk$3p7&(Vperw)HP#XH`JNa-#0+rkQ!ybybx%eN%rBAb5u@l#j{WG5Z(dQr(00> ziq)qLghQvN)UIb>Lti2N4X0nw_GvC_Ua%it)<=a4JE(~3#AnF};kYC{&XM)2Og-s7 z2US|1BH)y6sefV?J1{7uehk|s^CV$KeOOX_&o09{Mq?nDCHjb3`kr(%)8qdUy;*EH z^CFkzs&p%!zzL4P`THLkp2=v8kZKo!1n+Yo|KR@&-~LM&@_$Z6snL>%cmU;pL~dVl zEHX!ChH)Wd6n_%U|0WfM`{|^kuCCfb+;`jfqytZbs=8%kz;M4Y1KSiHm@n3xuayCw z$kV^*9hjGB(`WLey_Em$?hO40O^zjVxKBU!&^%N9n}|T%wNjWhXe>Bi3KOYuN`66F zZr0Ds`6{G{JzB!pf+?9{!0jpn68f5hi!O}c8x^0jw`~OVa)$f5{dKH9p#(XD26zOH zHj1Uxxh6J?!xLAJh7wio^MN%ritBM^*`kf{{^ds6nfR#0Vo2z82pw`mOZw zt#s&J_4k9~MRj@VgF`SVyz}6lXI{Go_H7)opp;z`VmkqIXQvHhNHi_hlHhuNxBL@b zEA8prVdUGwnRqdv5r3)0&93yN#rPaIL)q@~1fkJn9*3irNcT3dWl!6lFPtr-J)~RR z#->@tB{OWZ?byrmG+O4Qpww)>h34TGo1e7yYlBwz=MYgQGp2w{Gnb;tI5Nm2KtT4# zOXCRz8Gp)-gTw=el( z9N~NivcuY`PLYoO?ifE~b~$#|xpf6CU%BxLeelztP%rZy1(o)lyfgC7NpxV*f)sbN zVJafj1Vn$wz@T%&0sirJ!Sxa4rUdlBI{t^y0}v2ipd)rL0g>Rpe6auacJZ%S(v&BF z>JHdh2enESRIoDhkp|OX(U7~KCZEL6(E5bq226ERl*;YSkw#5XkjOHgK?IU+Y|D`g zhX%&ZFVDv(&o9^B?r6WEp^FW~qs3vN2s4P+ksDl_{8$sClf2r$#3wRhG8Q4z}Hi(V6)I~ z?Au)_9Jp&LBbYSM%c@4@n4Ep^keOa8c}Pvj3szsUQ7|}of`x4CHpHDGK+aRHSH4mQ zyi(KsswjM0U?ZiY1h~^pEj|ZdmSTSGkU7!7p+!xQVpjWjz(z$y#+CtO^t3t3{YEJT z6c~JfvPGhb@`s^Vlh6IMiXxi$QNkAfSw0Q=C%;tCtlqceABa^XXc@Hrgj>;X{>*|~ zde}INbqZ->?(qO*t8e#kB%G{bxyYH2vj@h!L3qMH4*$dwlSB6*(d+60z2(?#-2v=W9Fb29EP=W*aaxfGpm>e%RiLLO+SH3PqHnMziSB4j{ zjGzYe8P{m^c71i%EpHE3FZhJ)# z;TO*3El3Svs=Z>1Y*$7uZsJhKE%qL3W^Alj@h#GQX;MorC+^#RFO)wIF&rLy6h|6l zTrw#F1vs*<@wF>Ee#1V7tiwTY(@oneBDRcd`HLI8gi1Z{7R5n8$*P4IdnKqo|3h-< zgrs$i4LJEze@%V`9qmfe1jkb_ zsMH_3U@)nd1NaE7IW`c6pMVu84Ne&91Hof|Jt+QZ=U*x?UI8a)WwL{?`GaWSEeI0@ zA~ye8#(yJP>l`2wpn!#CpNH|Zpg=(4{z{7Yci~i^h#WyG><~UlYpMr?F+324G?l($ z2$XIAh5fG^*uTO49#$)F5QHKG5UcrG<|YIj4a8rv@0EX#C@&mh6Ij-XyDP2;I8c1x z6#jFg{C~B>I*d=yIvD}+{m-m-uc9Ef10lM=E6IO^wRT29w15E-9uQnqsld{Kz`6K8 z5lr&HdC21@z)3~^i4O_AbA9J4_S}ZXqL!eD&gIZb25)ZnqXb8tsuM+}M9PdT8Xg5~uO9ri zbbKxnf4xryZh>SCs2~%h!RHaAF7pi^vSddEInpf#ocbKpQ59a(cbv!5`(^#^cFwovVN8{jdxm{ z{yOK{Sd368MZJ+l={6% zc~Yu>SKNPpG&+|U&u@E&T=s?HVt|u^p8jE|spW8f*ugw8r5tbUlVrtwQYZSl=7^`; zO^Tehx?YUzk7nlaP$kP^-1c)svIld~##?t%Zu*WoAJdV<)_b`u*U*b-Q>crqy8$dY zi#rP$gIVqyz~e?J`#?R7!snU-wAhMck=BSpPdRa<%suGJW6|Z%CAH2Nd;db-FRU+e zhdLUZ$2@ZOMf(}WmIy-~`MVTsyOs18o(5CMl@Y95l_n_E9M=9VuQ+9%sHN&rCSrrs zQP5EzwG`-974&sTYB4E1;+V%&b>l-hwGuC#yY$b!37gFc9Tf+6x zH)tvkM}X7|2>oa%G&K>i#2G0$89bM7c8iGdlvd$bPQA=vPQ5~FwZ*h@;SAv>#;Wq3 z346do7>|hn1#@m(nxgc$CE1~iE0y80$*PQyIdgtP8u0)@#~E1=|IRVL=gArEk6|!D z%rCLFJA}V3T|qwx4lOXNeZwISXq%`F3pHPcEC6bd^^|sVWA5HT;zsq8X->- ztvIwN_8K$EsPCAB2fS=FTZQT`pc|vHVKjp3WVp0*L&rU$X<-nCqLM=EUm^Jhc0P*X zFU(7CU4p%1!APG;mS7&|A-AgWw^HglWifuHBGvO+VJ*6KBQBX{jF|cAh;O zn_-cKt72^k9)b`#G+7@u_9w~6n8dh&j$Cm^pV7-a%f)DyklB~VqFQ2x`kgh`$fzRT zKBa%(A-(Oy6N_xn3*oSB_~(uNkx(fxAGjrC!~Uy<+yC3_{v*ZFR3-#;Yeh1|{h!^W zocZ(NAC;-U6-)jNHWLL*((wnDT0MdfmAdg0AG7r-4Wj5z1@d#`tOdXd{+RrKTGqcS zXaxqe=7IwYzx0^OYXdvk{ny3l@4|ngUn%}HMA%x92l4y|CaF3>{0M|i{x!CL+a~^T z5<(uu$7#JRhVX*~!cO}x=6!(Aj_C;h+O@x7t^QRI_J784^s5G(9XJmEzsAx3_xu4T zg1MEW7Gn6%-nw~jYSswcPq_bzXZkmU@gG?PlCW=})Y=mRaYCpXgIr{(W{xaqmK14aZnTRui(Tq<8cj56XCg^LMX)*;wAG8v zHhwzQwSLu#e$CAqmA8}aPm^X1@N!jGcONek?LAvB+3y~cFYgJKJ>L7wAdM&T7{46@ zugmfD0nep)M?0z*x!m_z7nG;Lq?P=-oY>FpZHDs1dtNE9V0ODw==J=B&Uv9ZYHQ>zbON4?6dHgL# zHdkn}%VzO84`-walcx1>;B)Tu*m4yxbHs1ke~81KpszGYVRjeKng|n+i^jmSs?$8? z1+bfBq53uCqKQ9Y>&>CIU9i^?VHYXUC@v^s@)rZ*sAetL}T)ZmMo1r zmW1L`Z%JFiDCWYSWzCcIOxQ2VYFc+KcMpnI?|YES;bpnD$bh1h$`|L!5cicucYo_y z!CIhoGi)S`LAFBZMYDFe)alLrP>Qqc1O(04bx+PJF;zenE_m0Gua5T4mPnFxWBP^H zW}m1zT-)7axQo5}i{xktIWD~E26S6VYEjai^>j@Cf`1O64>l-SDG0?Mhso?WECQG&(ifxpDc_>mL{)XA3NZKg zc!dqT5tR<)Xc{M5dD4CRLAhS`Q$5DH^zv<%WDKq2#zw*1AF#F zZit9PQ){Iw;!eSD#R>SC^$P-JTR=n|#}Y3cu5_Wb)RzEORD`o`4hPmyGukV=&U&$d7I<5Ihww1 z4nN_5;fnY8G8CDU09CB;MZ6TIYpqC9)bpOe=AY;nr}t7mRM<0`uZ7hIy?`>o)xlB@ za+d*j8RzYBY}m8&#HgS&nyW9fYlRjh*k_SqBJy7+$0iW+U)$j9#?C6p6(8(&*#ULI z9#JU0XWs+dynXV4*+qnsgTPR-emR<%e^^YjF>xibH_^*weBSz>KJhof&_SG zORLG1RCY*=Vnh$|hoI$|EqymX~C)fi8- zh$5q&IY6~WgkAI&xVtk7vV)S4$Q`UAn~+P2J$Y~h=X+;k2tDOs-~b`cBYnO80-h4y z{v%+}6!um6t-=lwEVxhQ>&4~h9Jqtft$yoAPL!1@Ntvw4JZh^yFXCm6oQEQbBoI@h ze-CThNLiD+L|g9~9WGW~`65rs88C$)exFZp+j^Pnqp%V$TE&%xjN#y4#kIM_A`(?% z+tXzl+#=WkX-#aX+XaLnDEs;tikg`kw?Ww=h%ZZK)3}wp5|)OFeNWR)22#Y1ioZVU zCRTv%on((?!{}1DiWRIwNg^ip?q&>^&ExUPfjJiCC~75icn20(msOOx=6vq2`ZyR^ z{Y={kQ<*qodr%t^2chM6)rY=k7*q9KU>?POmiE`IeGI|0&=deYoa^Ilzvfp+b$B^|!>6P;Z8_!7#5FFJCb}9qPs;i*?jS^ zY}%wkBAvoR?wkPrGO5=0`W;!BD$(7NnvR!55~{^B$xYgYl~$~&`8&zt2)b5@GFwZ> zHXRa$w$^AnMg8$qb4zbLpJsab<7JktUHLaYr*y|BmP!cb5!rYq+N+#cM7PY+`&x+4 z5``DF+T5EC6|Y%kO0$~g=uodJcJB-+!M9Hr(Y95Hu*4z3XG#RQ}6g&Ef1V56I; z_fF3G<`v~?u$1|5h|j>xeb%NOK0bepgBki&da49@{#{hLFmN}8fm;Q*cP$02gz_q; zTtOuX-u!aGBKsI2Z00DWoP{-wUvyFw0ghYatdEK{DWNl`l$3RuZK7F zW_CODW90ZgGpiYjJTuNvX2E?gJul@089lSHjZJbAQv+Z}PWbopg0+nezlw7L*!TSX zO_^B$zvEpTZL$EVhvOXG9ipMncfv0mgwv3u@EHv~Jdeem`yBut_0%vRS1^rNhK^j>}6B&r9VE|{NU?iZ`5Y93SA z7dhvXu^6QfL^7nlEu?4nnHOwf?pa@~*9lf&L1of@B8bK8uQR;t*yV#TYb|D*yM{`h+7Np=*G;$RSbsQy@taa_!WtL%-C@|1&bbm7f zm|0mMOM;7nOsSXjJq`$=RC?E#)S@FMZ6mf3ej$v{)}3vv1VcQsdwcN1@2 z?~*}RPSb)J-4v0Ka7udm0?8N0^sS&2)%y(d<<>SNqT)dnw2y7?3IfdQ%ZN^^w#wPkN4F?Ag z2+_$0gXRZr(HNVzrw!hZB6g;3P8;P1TX7>HT=l0Bw;kRNb_hNiuRTNB(Y`zPfF$%( zb{&$N06~K)R?}pYZD91}Y2-Zi;4&fG*Vm<_?(y;PUu@Zd!_2k+2l4&eKmYMDZe z!0|zloSNH()#S~I{${`Ij{7t9?)cEq2vov^xO-SBCOn4Lk=#fq(+L9&O$wU^^5sf* zU(xdR@nb)hAi$SA@d)YRQwG8kQn@?nn~%M*H?rtEs75fivHkC>VXPX76C#cgi~9-x#7ctlRFL zMRho1<$o=V;~t++Vwx3TG&*u9NPt96hp2$B_!5hL=Pn_0x~SM)RR;_gPO|K$z6+Xx}({*;CCgpLigTxhC0nZ^Zx_}LdoGh znyv>r8S=tI?gTN(#73sa(9_}LOlz$7@t)uMnkq9MIiUE;MR_yEXoQe-&wS3YCK(Qo ztq)r}SfJn@sUnun@c@7)v>M}`^^s-M0O}jR=Tolj6aoA%KM4$pqHa ztQ_jqT`_rM@)wY&UgBCA8aGKsvdcuwq1y4ehWRJQ zR`{pLbAv3xsTxa1cMLIwx)WO*j)wE}w<^C~g-zb2l4x_uj! zd>5@_H{CeEphzuiuzdtvm-B&w!Y7Y}M7}gxmzp7Aw5#$3S+^4G3$FMjw`&EUBbZ5Hr*W)cox zooIK8*6!%Pl70vg?I_;ke8`1fV-1EQCA<0-?QhqPy82e_?+}gZ`IgWP^(4{w=F<(P zj^cm=#3@T>Wg;5?Pv&ONw&u=?Ua$EB~nef zg)yfMJ=R*I$}k!$3U3K_?X=^OZ^4*FU-Qkd(UqICJ4mvu%=@HEKhacODx!;*ZS+0m zaJgk#y2Xxd=@De2^W035A_P&Nu?+I zqNagT?&pX=m@twFhR>b?*Ge~o>Ez%d;qXU$re^7m?3W{v9iv!*Sb}rr0!r)>kS zlO=SB zfEMR`;z-exCNt$^1iHxjR6mz;;gw0k(}u_Hh%W{k5Ty-7lsCP*DdO!hnHBt5u;-&1 z_Gt2*ylv&aL3`82v}O~JyGM0vhc0rsl`Vt#)rU6pSAR6Xn(cOSoPe9m8poydBWups zBcTMI%8DIP9eZ?_3WKS5a{lm55V}4fFcM`GSA00#yW|?-l-ir<(tZ>HsfckiXNey2*cqcnPf(0#X*-&a}B_HEtB+t zOWrQ0p;1-@mcVcpz@&rwy@2~d{brU}pxzxwhSVOUr7<|zB*yDu@8DEG)Tjj9S(+tB?St@8uH!8B`mKN_F~h*mmte71jw> z(1{*9ab54XKC#vrW8ja}p9$iW=Jc+A_|olD^~25SINkpYJyFMl$p7mw4Up_^>zRlY zA5hN~_WOq}J_DL|VCxIjs`3xXlPAwmf`$zJyBd5U`{Jn`woxedP4q2*X>isUbQAR~ z`qt0VtUb{|ADWNEK>0x;?i%=Qh;M=9#E|Q^oVsIAx@rEAn(pZmwba{>eYZE<;*SAe z2|1Srj3HpYA~xo>TOW&y`C^irT}eQ-qL(jR_4UtRwV}biWm$dwf`2^IuJ=O-^wA2B zg(^%M-6Xc9QLgBH&(6e=27|lq&c8%3Jl^|yV_`=cIniP2ekll@ZqeE3h+ilz%w6rZ21+4Hb zoVOss=Mvzb*Ugx(&jGCTFHXG_Y9ezweQVy1Fz@pkuWoG&kZ;k^VmcG6HS}i)3@kBoWhMwv2n4HM4XartvxO9S zVRKDorCx|9gqPRw-|bfunVgAYqWhVQPa7VoE+2Qf2b-ysAAVb4ASt_s?ONfs?*J~u zrI%|j!3L-7C|}`>v-dVo!+YcDSp4(&cs%o7`PsJwHqNm#dapJN!^b_^HhJ&Xw`+C5 zh--E)oZB5lK^e!=PG5ZufT*`mu}5ky>SfA`!|1ZW$wlg+?(910MAs~SoP|~f%8I*^ zcj4?h6ca1@Z{Mqffr*;gAvI(}6oSFG;VMVH8tK(NvCAcSvA7LA11ZwL}wh z0VOI}^hU3grdBM9PAZ{I)RQ{`n|s~K^qvzbZn^t%t2e@fTx9Hy(ZYB1lvPcGtPh&> z{D;t3N42glFcT&bpA+k~rkpg7-BmP>^5H5-xt`>Zya8_%Ll-rE^jT36Q&qwUp)q@Y zs`&;3fA%EWrvWx`{0wR)>I%N;T_ZGvx|cE z^hTOeF8$@=P&DDAaXA;!x8Y1q~o-NRIGvA5}wLP2{#AZPiF*5)9MflzKK`<6Bo7qw>pV_X|26}R@|@Oh&mj9sUcC%e2^lP zZmXS;vsGcO-~o!fFsELwJ43MQRzk7ZJA+c$e_;z6}#NY z7JK}y*I(%=-_LlR6=Jxn2^2`&M0BR!awV^KtSQE&e!zDl47LjYP)|m8+NFZ z742c`!H8r?*c@cJ;q5%>zheId3NYiac}_fkWBn-DaR&TS&#G7N2U<6xkKW2rE|jvJ z+=ge^&f*=K&V#-J=?s~zQj@1ByQ8!GAh@y81R?mf`et#0KDt;?-GU4bY{q&irgcvX zuC!&s=!dKVS#cx1dNJ|)4+`GNjKCXvos+)4rv62gu<~XL*QKt=`OghsQjmiain#=% zwKqYdo&n|jUCuHJM2Xv38yN6UCzfB15QHNpmr;M%(l}8BNRWN)U|=Vo&KPN~2r&l@ zHILEF_;J^8-9VAJE+j!X_C-Nx115<;@8=gh$w4leVZ{0r+<4?OL@zzOlhw~fo)au& z>xvqX)(WZ0=&)zKX{-vK8RM`~J|U4f?Y%WM`-V};p&F&)MLLQ7 zRvUB@k(H&M)5b78<1u@bWvN>cbj#-$(i1@KP`|din0Gq1o9qM4=-Spp&axxA5B9=f zT19~Al}6i(8+27Ifw0B}v6%yo{~HKjc}?r%XJ4r8U8zaTno)j`o{Va2;Z0Dh3d8c( zm$&50xs}PIRz~E!doQYeU2e=e&1moWZSZ;26_Y0CK|NJojsgUwt_QBb<)T*qF1p9b zfj9al-RGqE-3a0Rg-y6CCfLW@lX%ME#$>?dC-O%B4!rywt>V)8b;~nq30@v5yTsLl z*=H`eOnUaQ7j)>a5$@3i)4^RW#s=(-DliM<>Mhd>zCRM`Vk*Ur{iVvd!mJC^a@ZwC zX`q@u>B@jkuu*T%^m50yW`8zcs1l`G6-oa<8Mo5^(nmYlx9f*9lnc)7DT9MdjnD|7 zL%;=CRw{81H}v9LHv}F9ewiBdN}+ckNfm^gI2YbeYI`!Wn=KQiT2bNtKA^u#eG`-C ziq6`2gDj(QkaU1AEFSKlw4z8kaf+|P~CTro%Wo|2+*y=WU({oS^=% zu>`Mv>%@p@xg>TiBzC47#?Rs9Hpl``$m=WRQ4h5A8*EFCYQZlYB`=sIC%?i!=!ylA zRwR|B-&ZK%)}ae9gKXRN0Z|BMBFH_-^GK$MzYh^vdT6!UXz)?2y{kfPNba?g2+zpV z;Od}ZLWe(b)P0lJ`0=5knm$;FW)}Tl2z}peQBm7ws{RPe&?hTDkYO9wEBO)!b-S!~m z*wcTmX8Ip_w{S9F-_OsIY-s z7?*?cAwcXNi1AwMJ)9_53|6LdH#Xg%I@RMtlwB$JNT<`7?#&jx>Woi^K#H#km0lq2 z+~K!TWzS`jXMt578FeZjRWF@`LRUf~WNnxZ-Eb)Ul{zV>6BPKx@$Z zJy>RSY(rk%PSDRA^wH3TEfBV^kZ0d;-rQ6ydrhQP&yAJRJB=y04(ssBa+ zyL`YlO0G%V%2MHP0FiUB=AspLH1Y)Z3(+$^bw2f({<`5;Vd$Abethli=}QJnXZlio zVtR~8Q7Es4jz?_p{Uqfzbp|ik@LKnZHCodg$*~^qaUzz!%TY3>GV6}|Q|iXp31@0D z09k;L@Q1qe;<;&_4T-2G8G@VlmD}q+f~17T%67#$>5ugIjOVJ^SwVWJ++Iui_vppe zFvSTZv~n&&IQ-$W9ZD#FwFC0m zih=xte{v}P4f+pJaG@o9q*R-6e5{sb2)94PHtUa?ZWkc24fQW#+rL4LeSn$5fFuNj z*5)+`uRkO`y#Nh69U#+T`Y)2+zrlc=B}p|L$A?Q5pTI|J4cdW7hX!JWgmRHmfq_6P z=>MU&z+j;N!nPWnLJ)zILqX5LYUIHKNgO19aX9FRHQkbKRC-pT)a9{OgOj%GqtGf zw6?-fQj|4LE6!>wz>U_Nt7Xc=H^gH31- z>|u6w$Dp4HHg|hxq(4y`UsT71JQXW^w)w=g@}t|{MT3FEejL>~b|-@tKaK~s$}l$A zRuh%u8nj;OTDNn_4mRlXi zLw&v94waP(>*pQvyeNZrw%Zo6l zeKO@l{0UDsQk}WW*$8_8*CvNmjx8P3EuAP%^JsPypp)O!pyaDhm8>BPuhUqFLL7!T z+YhbMj^Dig{Wr%4{SbRg46!#h8XNF|Btd$n0OVr6_P%cDShgTj!AB~?AKj*dWd*Em z{28=poO0k%iabAckt57Xe`J0#YXVeR@6~-{uPDu}o-0eqV zzaQ;W0IM~)a0r9aJW^Hhg8W1i;>*FGt^Tw{v~4oaOCpSmvBIdkMQu5HpJ($SPxvnS zlt;{ZL_fmre#h{LXd=#F!0$n369u3SOC6{8O(=0j=pIu_Cn>@BUE}>RPeGwL9}__H zlJb`f!@sUR;6GFA5+G?)g{FY~WX=x=JY?WPB0bxv!a)WB`A+yBmfk^bA=PLa9}-Zl`EIDIiSv7t%uy70sfO2CwMW2SLKbOscY9lQZKf?w zK%lY({;q?v&QkU;Pr!V@ur6~G+}Rzi_NV8Y*^CR?`kI<5m>0ge3V_?I@~^&=BNGS^ zDnA}V-<&7?47#W8e5bg9@q#@>dSG=}zi)R8#@V)6f8J%D1O|(cS^%6DL%GK}jRXmA zW-clPUSF+93Hz6DZ`}A8_Fz7Kg+x(yJ(nP5-XtNxb`K7AZ+v^ZW?Ony0PBvtx@ot3 zzR+gOx!d)^VSKJbIBN69>hhExdh%;S6TIFHWifcn2RrI~j*q$%0KbXAsvY&52-Q!! z*>$r&L}1)Zx=BGo5db`x;yAn^AJhuQ->4EnJg_o6xZq%!{Sp~sBo_)mU2;pgny4rl zk;A!?vQns{lhvVP&*G#bwKgMP7pR^jcP@W15N%DfM_}T&GbfX}xh?%VHcJ1d1`wKK zKg$d1P~zKUr|F%uElLY20hPBD4L*TMAyTGnVA~^NO0aQPn*iAQeo^$Uin5RiL$s1m zvrJ(pnke(88M~b!OP7|A|AclB7IP4M7iFAAN0d07W}$)cbTa(|$4w)9kE5U@J(>a) z%+EXH^FRlO1y36v^?qdzj4JA?t#|zP1htpIhxXGk;eZ{(%v2%hEeopK1PM=v7 zzEtmQgBrb9`n~{icOMfT6Fh)F4)*U}@#!tqcHcPfzr%NcM<&&*`|E%NW zJfn@KL2g*@%;ig<*1sYI3v)1OmQ#+oM-kJQ{)v@d_qdFBF*OJ%XH(MKCSZ(yuSP!1 z$vF&0zDW*<5)l}QvB|2mqs6?npG1Sm?H7lDa_k8RY%?6H#rOqzHQH9RO|_Zmq}}Uq z(;YyIt#XXUalbXJU5JnAy@_s;#gB zZF>CMq*g@nr$h;XIBWryp&bL&=~yK0&MDewu#Ympw&HVRR1eiN?JTT{5$vRqOy45f zYm$A|0vK&<+C&zT86&7SZ%&9PWLUN)a6 zJuO$jPVEa~n0bBU$K%nq)r@j@ARYQVBO%X9d96dd$kqBJ#q~U*;61AB_RgT)c!|8V z)iQ4-YeibXF>=@$M9?%+9oN(|+tSj!$Z7Kd_%dNmFCU7Q#0AE_>U7tU(F~z5jsFmA z!B9DKLI_*kG`-erQ@Vdago8u4#o8^2uS*MVFD&V?^oodd%4+Y-K*yc;$#z6ZGsSXl zh_36t+RJrt@nBBAIJwTjIzY?=fOc_;ve=~=0ma3>4feNY5Wc`#>=`=oQgVuc#C2Qo-#af#D)0`ew=r$hFn!k*Wd0?^FTd!l#A zPQLnYV!W+UiK`9mhs?|5J5k=J%7ES`0m2z<4$hn2Lxb8f(^={;sUny63m#=~qI`qo z$-fZZabnE;GUjUdwuZS))De}E1AtiXej@<2A^N=TjK_O&nn&Bm_%!JFWZuM(cLB`y zsg^{K^~FWEoqI~W6xIiZJC2la9N9bZmM4-StC&te1VvB=lusg$Xc*i)aYq{4(?7A89`ljMR zGF?)Ru%P)rmYIS#kz7_#|)mW3dhL__7K;4F=c@bWmF_2da5HrLd;Vg z?-8G(zhu(TiPwl%b8rf83JaGj-zarI-QFVhB3K9}^bg?(uxItt=${S})LFG=i9_$x ze=06922x7p+Y-@o>n}S=45WzCCUl#A#xEh~%X?^bkr&;-mQ5GtMPTODZ}^6qIhy0e z@q99L^8h_|UWtu@1NTvLgj1goWIL=rQTw^nam7$^O}arBBCb^`L(!PTLRaLg!&XAV z0bTnsbiBr3U7(%Sbl2x!*49aRqOxsNQdIuj1Vmh;bUV!+Zw(%fnVd~udbg^l)9lB1 z<@c&D;8r?m6^q^sbFo94yfj2ZmUJc0tg#v;nyudP zx}hhG`(tbZ)ja7t0e1&Oo2uI0Qs5vFDWiRuy0bqa*EfoZcLdg1Czef1Hj;$v5=KtG zc)*|06Z2^D9o!7zE73(J0qKf55gh|=Y5I(IbT*ScLw2D`o3~SklE~t;*>#iaF+L04 zmA#i)DaYJ?dP;&-Ynk?K=+!U+*ZYBSh8v42OU}q(ZiVlVZs5@P&moeekbWubAyuL` zEExhyJ0-oT&nMKh4at;2FtvPZYG*qk{y@%>?!-P}%GdsB_UdGGcse5&z*{VEYFzDr zc*(O0##j>dy(_Z-{d$#wz;VE~r_eUyauJsU(kHX}SAz^8w89_9Vg{^pQ3sP2iYC zDC?DyOYV4AkXL-mBmAK0ZOov)y6TEr%*c%6Yj5i5N)P_IY_BjgM-$5jV-p1?Nh4ZbR=Z%;dHS3%)8%^1Wzk4%4BtS||sd_)oLQ}##HR@8=yBRB1C%Xbue|W|P%mnr9xSqfg)!sV< zS)zdylTXBRW0WkC-x1=RPYO$(T;kN;IgyHPE5ER$5at_H8VF_i?<@&IlK#+^-gW?D zdM`Nu4VaoV zEyg)%8*EvBV*soGRnDUf@UW$?HZnq!I_6W_nwq5FgxVo&eX@R8;bYZDkF&P7cl5Nu zD!}YwaSLn0hgv`TL$f@|L@~cKp3J)bfp>jLtUiVxZ3psD*M<7}L*8`i>^v=4QM;RU z@Ugtr5S;%VLf!{$|Ac;a9=Kik``znx!4b{3zxY3VZ4UT!1;5C+U9f2TzKqV(XBsuf z&^4-b8fRiz=L=QbbtMe$qRNn|UgokX>i0~808-)=Gxv`5{$xT&-(lj9$l=Sw!iMfh zp0AwJzg%j0Z_jmr} zh-SA);L?35080?lOxGtqH3sn=9{-)FLYV6Rq`=bMDF9gDGD<+ii&@u<_c#uRn04sC zT{MF9qa{m+B>V8v9TrFc-~bu`@Fi{6)GKM_55X~E{l%U9!TzDu{EUDr2x@RO`TG{+ zuf>L}`rn-p;to_ z+_tTu6N|33c?c5XWo7H2rrLV@6DM`HnA}>;Pkw!sm;^q`4I{*pY@c>w7!f&Hc!V(vLn}VC?6Ap03@+~dsI5K)c(?NzhF##2RR$)^{*({|S zw%xipyhcY-Tv?0O7d9=EPn`NE;T(*M)U3QIF&yPu$lH(H*4T0)0E!PtHquc^T&$7Q z;y;b98BI{gXLI?f+a)C5?)Bq;A`R_Ns#gb&OFa}y!zaX`fjVK_?LxG4wVYCK>%-{M z1~CZPUG$Zil8&4t+=46+H8@wvRo?FIZ8z05Rge5&kah}LikFi!<&rFO;=GF8#Y-|9 zW7d#B34nPqFn&85yCaZeVDw*eZjf^V#R--EH5#7qB@vC1o*)9)h8!Z)BqOdV$Y*(f zvoC)xJpRdqy%ZF{4WfVsEC^O`c0sooVjsA9{&IGmO(E%dj1`DQW7~$@=!C?Mm@oI; zT^FQro(^vD^!gg*S`YebKk+H`;y}Y4iyTI56J(Hq<@;@|=)WWM&`PN{GqQr~!vRr6Ea-Gei?^ zHO*F_?pQ>vV3P63bEthk8e|;-H*pav_KgM(Zeos`vF5}zjAatOUmJ%xI>ytxpXW5I zWmm{9;{zhx{;!8MnA){##p)`-mMsqh;|I+t&n3k!fj3f9*HY@O3rJC~^nnD%UfFf0 zLO7?L3oWa)L^{n8i=VPR>7ksfnb*uTQ7+!$7T)kometKGXNEJ*SpM=9Ccr52FuoG_>&?q%|$=& zgKpL5;Zr(UmIU@MO%7{&KE6PIomOzOc{Eq4faPu6*Q`#o6gl8$>hep}ZQM1Vf#sEb z&iWJ8(U^@f-Y{U3-jBRXg47N(pXhZYB|UwY-1O`YHDyd3#dVy=QCjoNg>A;9?wj2%hb-Dz zn>Aa8?z!O`DGNDd&CNqXrMC9*2Szoox^NeR@7K6%Y1XsyDB#*a3m)#ys|P%1=y$%s z6dEbc(qc5%a5_gy$5_BxLRDpz4T&(Z?0XPzLRF02YXibfQIN;S8$j~RTt|?;WnxnFBQ~O-(mtjO)@>{l zQ0i5WDHJfFniV*fDPsN1s<7**FdMmwMiEzxG)f3xHcA+tmcWTtCo?TgA5)S;TA~wW z@#ex~Cm@wtuZ%%C@xJW)yR6i!5jUGd(ezUsr4fSi;^8sveYqUOm^a5(Zn;V4j)(`k z)Ax=iQ;h*H@Q;*Vf14h|(C$V~8-YxK4K^4~h5Dh7p-CRnC92vNPv=h@l#L>_yd38H z{4DA*609&3yy(OYb(f{|vzmm+XR}^O}>0|J&eL-So`4q*WQxY`2nWD7aueY7TJD|5KzuOZQ!Z1afRT00dyV0!K0% zG-?u-d@qCj&sU-6s(O7~1S%Emg-X5BCnl(42y@1?xe7lnH$~>OKHOI|N@;a`yIkF# zBcFS-?&=7@BlkWoYFHA!+3=lNwLEhr*aF`EW)38L#0U*_6dyH~8#X7r!vHl-rsD>< zQb|rIcGrL!K#q5-%y6o3Z~;KC><1}0b~u`D11+|y9l`FdVk3nh+TzIqtM3!3wX3x# z1A!J9(x16)zC)&lYp$EAEHh0wU6yUx5h;T73mwXt2i)_^Jl(4;h?LrGmSb$%S1W`S zZ9k>tXfE3yc-nVZ^XzO4m`Og525b(*4m9IWk z>Iqs;xqn+i8yerwmJf@?jWs@gT4h8Onw!G2OpSl@6z-;$2TgE~>^?!)a@~SjUgMbU zMv0s=F9C9S>&8D|_oFbp?4a(7r`qkxmx<>)Aq`FOgLxK| z6)HH?7EOBJ{Ido|>1I(@*E>q{w!+INQ6aWd`ZfO@@j-ex|NT+gGb@5oTG63o9m3{C zOmZ;Bwxa5L@_9;|tOP4iC-j0D|3{HK#)ITi1AeuvZFzj^0w9dX%yD!6k3nL(u*G%T zZacdJev`_TNlki&6RM02nIlWsqWNgcx7QOQz~;FLc0Xt;N|Sn14Db1X%uiiP$0sTZ2mssvbaqVL2@{(UKXm$bgUy)Auej_Tk)C&ariK+}Q$Dlqd>fq=P1#6vg z1|bOD!l=>I+yna$4U5lk@52ONhlyZ0Xt#zuoqO-1A@X7&0GT!n@02h7?XPTcD`Okp zUx3+5G@%C-ec`SzoyY_p)do$1E$os4${S>Vpb<4j*!EjoAm-CWCCLUMw;lDom$65nsA<(zX{V3CrsM7RrQRN@@2uUa+g0pM@ zd@rfbct&d{DhMRvZ;bBGiZ4kKFuEOp`-SJ`7YLD)LLk+Dqu2ifLj!{x01PiMFZX2z zdxb^!qzqP$r z4yB+_U$7roU0Mcvw9*qu&nz)$cke7Bpme=i*+;d=uwh07brBM76BNB+QPOH7O_UVpAra+tCl^jsy~jE#`%L!H0uxc# z;CK>K+h-3U@yb#XeH1cQDb^k*;)vjWbg4v22WY z6~!DW7a@vMC_uvlii#0*8 zU&sIdXODc4^K9+N>R=B3;R>*PIY4g$bzL|h2Pp4vWrIIP2y$HUz_}iP!xtl@dGU*Q z1wvFU{$^MH2+1Hq53=-IV^kFIu0Me0MTFMxyW36$Ij>!RA-d`RE{@0r0VG~TT9pi3 zQ5+Ck$@P!2&3~9ONEYp1in;WiF^E#c{{jUWyb}Rfe_5B+sq@n+WZkp>YH*>Tz>uCj zPcQodkTOPZgX~KT#CZPKEZ83<%S+$}Mos|4zrfhN&OHJlFv`Ecz>ri}&CA10aJD`! zkcYqj?O}*eZT)4(gLVgN(;++7__s*%k0Pgj6QamLDgf9ZLSSa!bos3y8oH^!$?yJG zx(9Bk0?fVaRnTvRoAZTid>2^M&!4p8&rZjxLB;Hn_shWj7A{r}^C z1X)cSxb27~hVcZTd*cLG6I|P4)2s^_DI3d9OZ0(_ns$(B~x*eO!md+3eK} zMGxu=Ck_gQx4=I@K2>z+``=WOW6ye^}AWjYSHPQ=x48+}<} zzIaQB(Q|UoSIrSp^3jFVTx$$&FoYxJr=qa_zz;Ud$Pe?bih1jqN&#XGN^X1_nEOk# zeDOg+SDRnGw#mw!Jg!TTG#;ZGG#}toGY5YOit&B>DR5No!v zR~XABIP=T_<|kVj&N0|$2LhsjvPkBfK$(_tixfFnp)DzlD7!9GktyG?J0uq(OIiMG zOIe^2mV74*1`H+T2?CZJ zZmaKjryCQ*J&WFR)hx>7Q8Tz@&}oj0ZokviAK>^|){wMQw~ut@9cSj8{@vgX?$4~X zP9VYT6C_k1{hRIipO#pN>8N19HRK)3DgL6j53yqhe~U~0%=G*pN`((Rdufp@>`45b zCt72WAJQVZ9~8$C;WvjdX=H5NlSDaqZhX9k|GvgwemUq-D&Re~Y0NJAPCUofasso( z1x>`2U2YcTy1zl|6ltzpF4=bjt!)8GlFn|I zeK4*XrED|)`y^24f=FvmfBUj1nKnLebrvUoQ$%AQ z^fn5`pITvJY%>joUSW@Ch+a)A0vm>5yN?Aj?t=1K%J9NbmO3jxVI|%y>0nTnfjXHg zld@9sk`qhA5pcsEM1t2S>6|$|As?0P6+#;2Y^A|Us3~kbLfVh3n_A2l+Yve;(ZX-m zA;BZziC0Mlccb!*P3M|sVX9$ZA#ap+uJegQx=z-b{vLI*s6qJQj~Mceku?G@#7qnR z?KORIkzk06^g)KaqVv}cSeg(M7>f57=kY%;HY(U>7=ZHXN^`+5a1? zgU3ezpI>02q}Ugo5Qq%KUjJ8D^(Rp8jR4@LPcb@-yLe@Yil)ad)gP5Y;2pGgGIYtPkozcf=~iJ-2HAn zJ3ZWJdOFMP^g7rbfhy3*u?Z1$PDQv>Wqk=ez{`KV3>#E?gfYZ-B(|~a_{Eu zwTQ|^m6_GvNp?mg?bg*dGppS^yhnA33)zCB zeC;p>;gc@JHmXf}P+MI0Sx9zr$<&$>`zwc4(U@OzXfEk0;n z@ba|ck?-X3wjP2Ro~8l9lSRne3d7s`diuWEwcki_pN&GYFARu3agG2F&Yr1v^UsCr zy6X4f83H2M8t0b@ukOJb4(|8A$vyxTJu3uvDt`ea$a>xc7VuZ_svNrlLh@eoBZ}X* z4}-pf#zAXSpNSc(m$?OrzF~g->?0`un5SZ;g?O@m?F~&+rvx6+#QNcK#$a7!Vo<=j zc>L{3^UTe=U3^RF*(8)*aVqvRu6s74Epb*=HO8=}=CVdjz5Uk4UPZl))#?WDz^YnW z6n?7a#}&MU63{ASVfjR?!T0x8!t$~0_Y<6ni>RNuOpeu3%1w4fHgc09{LB4NN=KhBFnmz8NanzLA7I zg$M&?x&t!}l`iVsCs^U2llcIF&Zp^KfU+oll{uoVF`>BgQ^g)P9(b@)pFYdGWF=Q1X?-sqY;6~Y44=D4=Ntu* zxU{!?=I@~PKh_0Gk0Sbr%Yb>*yF<`<-g>$Da+PcxIVXuR3%B2*UXPiG=j9d-wY%Tu zJTcRtmgny}hv9J+Duk#2Q%CS!hLak923^JdGH|dQHC^dHdMj*)*&&|J+3WEB3krX1 zERxJ79fvo26V;SILAGgdBQ|DDUqpRrd$`i{xvvL7QT%#HyXpGz{J!U%J31$iQm@V4 zdyJW-x#Jc^Mw9XDD__Hj8V#UQQ)8BQ7sX{qVJ&we@Gm4hySP-+7%{bP{Z|Z2{ zDfWf|O){IWJ>H%awu%eJCNDG|Wrun&ZmDLaBBC0w#3=jU!g^rX zCF&DsT-2LU0SLplfyYRyOa;YnCSiPUTM6#x&RIJbWEa^92QV*T=`>*@+TtTC-b_lC zHu+90Vf05iVp(N@0Ro;*=gB!42Gggn!_zP=&-nyjiQDg$#PP&CNrm%PBx`nD0mQc| zenv);9yD^@EIvyZDMm1NIJl#37A^>O{5}z`8H_JnD(-VX6g7 zh{kS4Y+M-04D}?g`-JqJI(65f!3xlSY4L|CBoh=?^FVfo|DwYrrlZWnH^@Rev*?|= z1>C3+kbd)qH_q7I4IHm0UN?J+>cvpZpI*m*ps{6C9P`zu1j&0N$C=L?-00ZGk11C( zu*tv4fiEBp0G223OUuaKW-SbLS2RgoC!T4qE)Bae`G`}9oI0J7P$ZQ>48@wc31WS2 z-kB9KT;1`#UAlYd#+(JV@8r-mLZtOwoFtvuQ8^hy%-*0Tt8>zl6tPN<;~b=#iNDMw zzerR*RA+kd6^#ms>Ta|E19ai0xOm|z^lsP#S43AW z;bA-!rEE@1w0`sAfeQ+iyB-45!D)W|$uC7IkG7E$mK#JVeq>;7cMo{|JR(+!-!;3P zQ(xI?jq&1^cj#;8jd(Z8`^Z?x0v|9eXh*T?pEN??jq3sE7vKClectzbvZ9iKeji-V z)u?Wt0DsngznXV?o%E17zRm50MOG>w0($P9;kt#x<>l@_##nS6)xqP}&hvA+?0X zizs1>x>Z(tk$>A3^}*_v)!~u2N8>_-C?E_Q1CP|UnnAgvX&s*k^B4B$+&L84;<@eQ z!Z`-nQUUp?`US$7klX-CPDLNpc?BqB5l6HM7I-PjvJ8tK#b(_flZ?N*-;HG+7DVsaE*V+s_YY-{D7A4Mwv@^xTBBy207{4j9m)1Eo&58UDG+3wk+}( z)|Hz*#NMQA^vx(23bm~Xo}<=lBy1y#6~Q#xD9J`pbixmNrZVdc1`FGB*Vb&PEZTR2 zB$|_-CFuhq*`Bkh>3P0+XJxSBo%8pU{03g^&>3`#xP}wmXAC@Q0x{4n38EFv5IegbZfaJA$$k|`i(7SIh@mlyG6?8o zWfH4h9jVK(6&3Cpg!ShoKh95BuFa<%9+^~C<@2kS zMrW|C^>W1|tQ<1G%6%{SWb9INvayR;b5PwKph_K7w!Fym>3jxiDpr+(rqM9V&k&!~ zl5$EA^l6 zBiq*LBzEULnF^%pYml{iIt=OtuJuY%u(dKV>(8*1Y%)UkCGaYJoB?hJu@(N#4 z%aTb;8?sWBjj@Ul?q)WY?{!g%497-$^G0?X;E@b0fk+J;RE4i-T)dw~Sz{v4Is#y0 zW1cK{+v8V8_iS9aq8J;EbIWZhk@2sQf5uq*UEqfkOEdKV1uj4lJ zUAF_O^5sA~%1Y-7!m|u{3rOHsUE!&f9VwzN8j#v*mF|_~>=@#R6L6UBp)@jMaMp53 z^(^giqSjV;EW_&(kWCq1y6;Y)wo81eLKM?kJU`oT@UGbU=`=3tR>gYUai7aJnY9cp z{Bev=6MEUoC;ePHu4FV(R<^wIX_|sq>9uOi!J@r!1>Tv$8``uMX}@5FWo)BIP*ou{ zPi%3u1N-yPfa)-xB#`(BvGDRpIduf{m*jwMrfyGP_ST}8W3sXlEcLr8!FKTu2IyCZ zEJ|LV-M?q)A*yL;)NO8TXsgQcnOv6fxq7y@aKq=YC^su-@xS4JN)?`uPe=#;z-{6Y zCEGyshhoE{J(tS0!M;U$({t1BALu0V8IJA>$lKi3Efb)1i43IlU%1m$xxSgWh9!v5 zu`GT@C;Wa*_>&y;`{Qo}A%>oK!Vm3|;}>tt1#|PCj%>@j@`B4N{Xn|UFcy1oI|sq9 zFyM~I4cW%#ndIgB0#x*n$x5c-`-GsDx)L-J9M+M?J}z2$DSU@2`4P6*e`qurAZx2g zE(moTkFT(SypIG#dY~|6UGZFaLK2cUCyXhae??1Il8hrpgd;(l(#w<~^TkhFl=FQr zQAKdG3cCBO*nbf19Z}I z|4h=4q}PB*iQ~feH#?hB%Ay|r7jFxET{GoWXyE1gu)%4Wa-Za) zHaF0d$C*4PVyQp(3$uAcIe|CDP4Sw}csAUtwS8IYxBLEf z6nnOR-$PvlsBjXdR^$RL9-Z6Fd%`2jNcSoGy7%f;#vDB1B5xD^@R9%BB3Q7~?LGQR zZ0WsK5J_`3pr8T&vVS4UCtM+$Y*SJs&PHn>Iogqw!<$FBrJ7gVTN2OC6b!SfAy>Uw za^s>UGI<={2BSjcI^Nxvez0YMH!Yqeh+c?q;TmrMbWhhoWvMY{ch3EiqLGnXa#m1( zOi{R^Sk~{)Mm{!!cNJ+X`@vk;>FsfK%&+EzUsBsr3PznQp=7eL5pD2lCQ9UZ?i%5r zt|Zs`6}DaOb&uo|!>&ffKk8}w%li!YGJO%gmn6DqsDXzb9N_qB+}1Y`ML_0LEHoK) zj!`~b1eEoZvb%Y=R^bwwY|5%y`z?s1NLTZNXcL_zDBSk`+>Xewl(V_2TYDA08qV3A zcN5CP+vZ`avHbln=cY|Rm@t%%OmS&vB6k5;)g?1`R9gzg(%dD6k7cYBoaypRFe>Ze z7Dc+tFh3)0a?PspRw+=e!iL%@?~E#c&(0##76aSsO3?$PzAJqz)PHtbzQNuccr0L=1`f3 zr*!>?#mx!ZszXxya_JKOwe&HuezW?da9e{Fc}_n(Dm>jI)^zE;bwR(ze%MPrXM6-=c7jBLKI{vh1JHWIZxJ2|^Fcj(zUPPm z(D{4i=gI;LhhDJV1xLTh3;VSwanT}}_~~5a3oGA!=1BqY>smQ96-XqP+zj{R6g5k8bWatDcx0q0n zD!wN6#?femZs`p_w^SLlS+T1*Di3|cdH0jY#JQcrMXp)i`>fCzps8N-XkIQk#81>u1;}NwFUo%e2WKz(+x^ zxMsZtzd~mT4ik}XJrDY;UaiK!DxB+D>T1W;Tx`2t%S z;f?CH_##>+Vc2vO-lBvt_{D}Bk;FYj380DPA%)w)_ocZISX4O?Sm))&>DKgP4sKB2 zBGs^sGC^b0exq}n6zx?_oHZpJi45R#C%2Op_b#VcR7G)efyz=yT}T85=0+D8i?kNM z@;Q&!c#}XBiw&zSOX~%%Fd|65`b&)P2`6pO0BaHlqx2ZoaZ5VPqI`ght563z#~d@T zX)=LAo`vwp>X<uMtHD_M4 z-8_OA-nad|w+&dvLbQdzDHTfN+C@IRBvnprCjzDlxG*W026ymapF-j?^mRxWv`R`6 zQDKQRUF9Pu;#3?>LX;89ADe`AW^FD0CBfC`ZiK7+^VWn9*NZt@Uod z#E@Wuuma!Cr@uh-gN6{)*4uGYsT9^}6;QOL$d})iy+Jc#RNWZBIl{y^woM%4_OS-% zD!FT1db;52iDZ*lMMw+CdpV{z2_0{+hp^v9maW%F*J+Rq@7d19Bs*odKY9X zE$DtV?@s4c^)hLM+>?Wp+ANx@J-$oK_7R-Z_A|MR2b_Z~vX3@$f6smvKbmo9!)^Iy z+F$2z63$5zpxKWKM1-3HFax@bsWZ6dL1ABb5YM24StR?Gg6-C!La)WZudt{w<(V+M zRJHRoI>}oW9!p-WG@^UV`_adCvMJh`cojzrJ=pnVKUkA^;0 zn|7JU{BolQ@}RRH751-VunIMNS0WO$Z%yAjZb%$Yr!(qAF+Il}9sDq$;YW&e&Wn@0 z9SC1Szc)mIn-e%^z%!&zvMn;cA*dh0XDbQKLP zq=mCLRD{5aN#oU=5xpF()+xo*8=wkOjtIM@Hm>{-MRVJ(9S6j~z3tYHe8$l95?$OW z&}L2wl`xBJrc_>xsw@)2iA)~UpQFQziY-$66eZ9YX;Y4nzQWWJwGf(bBN!%=^JZ-b z*Cg5tDC#v7Vv_A8=@wx*l)0ygiBTV!;H7Sde-=f$N9CM$E1tuQ7VSES>D+CCi%)00 zCpZr4+{mG*U!;Ja&e$}Bi*->VhV~vV z8%f}u26IB|7pNFq{_sM{aArcQXCxPTa6R>kc!l{7V>*+?{-)vK(l{m(a&PH5@>mzM zv@RnN{S{r=o&EJ6L)+}o4t`&8yV%4wFp|ApDIsSzY0!m@_|2?cAMmqz!aYo)*0J8e zsbJ!%c~?Q!J;JZlOt+{nUxOo8ama0f*8`qyjgv65s&6tqf-Xn~Ef1qBWO0f1hN0_1ISd~vCfP8RBRUgTd)*M`XUl3t zk+c^m>rJ!2bWjHhhktn7kiXNJG#mXrUm;E-fEl06E%GYM3yWir)g)q_YVc(KYa(n0 z1g+RFia6nrkLZUtnB>u=1dxY{m*ojx~m$?3#tJ10{4UZ2#>^b$A`A zC;oxT*6!pom0)i@-X~>`iSXDByQw5WuiTU-)wDDc*Qk&pToC1|J;u&DM<@wLRK%}d8CZz` zt}hwB$^Y!EC-NBRN^v9UuP5>imJ(@C7|G-;+2SoV>pjA|p$|rtw|szxVMDrp89my} z^kr10{yjRQsacnZFRR)n4M4wcOxq|LU*8>ukb&xOXKgO5@b=$+@1kzuoo@*5ZV%b7 z)k$`1`1*Ak58k*e&`~;k-OBn2q7Fu1xONPO`fWN8!$c!G0A5znkU4317e_ z`t=_6?r7wF={r9Xv2i(%YT?MlkDnd7BA3*YRh*08YOd5a27V@z8ma<{1#a^VRAlVb zE54073AfclMuOiFFd*@t#VdO(PCFl_dTqR=R@QeF6So(JgZ{c7InE` zr6Ir}o#~DM4e6;WZSQa3xTKeMChQDj@-8Y3`cs8MSPwm?s^(YOU+#%`byVa=3PvF) zx6ty=Z+om&Ko-_&LiK1BFIqYCHID-X0$LuI^ zqrGYOW`T-6!6>O}b;3vsQB-dBgE6cSp_(19H}=1K{e?^2D}jm-_zYKWJROg1`vcpS z-gmP%{ek#SQEQ*^QW0xqKKE`UMg2RKN3IUjPg_;$=8x6V?brP`;ndvbuS)356DpZP znMz4qQioIun1V{jIkby423xMT8d^14m+d7R)8#Py) zWMc=*z-bIn2+DLz@cS5LV@=HMgzqmO*@nEUbW1<9NH+UyVCx4a-Y&TKg&qC#^~1kL z`x=Yq4u_LMK{<&3rC|KO?RLOuKLCMvkbXOeIGf~-kc##>P9~tN?NA$RvC%O?~ zYj}cGd2+u|{%qlnZE%O>&Ew;*6Tv`wq0a>r%;|G{d!wJkhB83T3WMyya=6kt(;pd5 zD>Bra(+lm_-PFz zRQWcWqYa%%;FyB4ot49zZe)!zk3CS z3kb|sO2~A?!IB+k44VRRIRz}(%T39Y2>?nnIwR)#g?YBu(gau>Tm$TzsHV-GW6a;K z6BpW$JYMs0Lrcsgo*4%b(qEaof zhFNP0?OmZcrfrFLADiPjOwbZTJxp$SHXmT`ba+?^0p+eF<@&J+)jC%_1fFc-UUKvqyv(8nNDz-B5bsJRMXJ6L|Tc>_cRd&4ZKlh405dRRz`Fa{L7qzIWq3Ms>P z27O5^Se8T7RDOFI`X--E<5|~)>HGaFiE*^J(SEnj*nah!H9wuUD<4wEv|yGm&~s+h zXS&SZ@pMKQ&s~R%Vvh)S=eF2|cYc#fLMG$Ln4u?L>&BMKsrrBx199AG@qI&sBdr0T`}=pcvqf|+>)6jj7j1s zetz1&Oq-8J*)XL;vu-XuTv$f{lY$2AQ6sH$r(BCkRo^`}7m&95ji{66JvWi3VjqT> zQbtEbqLe9QwA%G@G)6w4$m2iovd7y3S_ljuN9a`;Q|Tu>2OELEssj2A#u|JYlV5pw z1fGD?0t&c4Hz!gbia3A}(;rm_e#|AG0U;Dd{|@|BM%qFPA{ zZ{bsR@lgVUhDG}oT#d%tkoRkRAy1KNL>4C6QEZM0^R}|zA4b19(!=9m5m>Op4<;rV zJC}rVMOn9eV#ov<=r(JAO~Fwr1WLUd=m=7fw*MY3`TVvlUw%CNsNOV)&QT?&$ekUm zc*W~`74Lg>tab-a`_|M&RH#zu*jJ+D_^maOd@HxYyN57>wwUThdI9*xI7aPT)EAj@ zw|Dt3L&$sS{10#N{|?!Ne3;&t`O<;X9u5Z_feCN&;zd@9BxMvKAHB@={I|yG|HVOI zFFjk5cVGZuQXKf17f&)j&NuWj`I++{p5#AJf5v5#Z^Zw)IX@N zSNjhbL^sKjj)YE%3e43we(44CM60vXPy;P?{L+ACSpcMH`; z%EezGVk)9KV_6B|I^G>N2P+k)rl4zwv12D_Dh6rI7vFSp{Rr^a_LDliHp{Q_)k2PS$f`V+qf9P6`Y!%?m@O5z11P_!;=Ut5M-v-c6s9;s9E`Y1=rbt~b_6 zGZXq~+|wu<3^c{3vCis%Yn<+70!e)09qvfRa$Y1s@V+5=GIMu-I zy?vi8CUvwhZA9mY^~u{C{|-?M)8XVR*N0SlJbSQ_Md)E`*lwMFJ#);P&DiO*_n;+% zS%OcMyxxX*Xy!G0Jf+&$#%)1^vhw462+q;_@L(C7XyBuH*aKw+;g<}8G5i5an@qK# ziJ#Uo?+;i04`Xiu6j#@5ff8(RcXxN!1b4TfA-KEi1b2rF?(S~E-JOu&?(TtvydnR4 z_x|~+?pLp1iW+Lx*)r#J@73LVZ5G}Q%DrQme9iQoxlALr-!vwPHQ!V6zpV>1oFC#1 z8-!*Dac4%t6DOr6cFYS*ZD-z|AEgEq72q>#%u+vu=y{)=S6SCo8@IL_4)l$=WaG~M z_*%6sNo~S*FFva3GrFCqU2YiyWUXY6Cip%7o;;E1LaR}d_(S|PhS|zZnO*6e-Iv~Z zOe@|>1D->EA?}y7pSd|wm#Y|2-zS3hy7oSV0+lg|Z-cmJe-Ar~X=Mnd_#R8uOIz}Y zP!`lxe?hoU$i!P7vF3s-xJ8f6%M$8zhm&?FgSDZhL}A{Z zp+I5YjVI|069EDQtd#5bWP*ei+u-+98PTbU@$8He`%4gn6FdRdL zhKPvzFbk;7MBKEBJmZeO2U>PW+;c>;wV=;2nj|HjVG_I(-GCBqsX`e=GZ4jHvqnCW z(;m_O`73sWc7?*k$P}`y6ec>CMWkV(f%=8hE8O`f(k~O0Bj!x<`uC9072R)M&0kz3 z39LNWMri)a76b?g@K$_?mInsF?yG)og76DrCHRpQ{TFT87Vu+B@T!`-NbKXb2EIPx z|GftOFM}e@2Y`AtC>0mLm}6Xx=YsHa4JrvXL~{G0Xq9}5ct zTUY>y_!ztqqCpan2}KWp!-?rdO9xMl?Y~?A0)hpUKmnj^iIN3qz0OPy{_l*WfLMG4`Nx(PmNu;fp+E=Q$iE1Y}773SN!C0xP zNb>qb0eS>_sRb{@$$);limueEF3mJ(%QxTXPWy6IA|^$o70 zcbwUhtE4fK* zhGJz3*}#@Swb$6(ezMCX*iwFv?l$VnT9aSEeyCOHqe|a9(&1!0X)KNV(fsY{e7W(+ z-Vg^ez>CCBC#$@&?Z!HqfM6C%xAnHqp zLzstWI7X_{wTw%7cvYG>tZUfl(2ejvi^F z)t!AHld7Xhucjytv~V1%E2?J>K&_U#WEb-)D#tm}OwhD0xxwe1P>}BtwT$W2g0yB! z|MbN%ttZVO1F>GKN&{OvIY4#z%kc`C}fwfcn3OVZZvC0 zgCz4+cOde&gU5}%Nj)D{nBdN*T=9(Fs9HGe_fI5}Nx2DMkB3?X5qTx=OckgTd2!+P9AZh6FgqX2TE&(! z1K0#6(VJFQRR#Nd!(rJ3`g<+2GE^~a1j7?Bdgum$0eOIrnIWQ??9qrgQoDq3{HoSG z$s;Io17i3bN~k+@lOgVLP-pZ+!jmEQB(yE)ER7HRZCfF>dB}R81l(mn^A}6P$$^hV zEY3#0hf!BV)iJ%ToPfTmv0rp#0G8h15O&KeM-yLL6ZGXa%^cn*$t=?W`X3P`yHxl3 zpfe+2$yv_R^4k!b_pNMiZw5y;mo-nn7Q-ynTI;M0bq9@1-WLPV{B}j!9V*TrV@Y=e z7m1~#D^=It8!a0*??w@{zbhjsCfM|vT; zK`MvcOZb_NvkO|2;6#7JBDlOkUG-<-+B_fy{sz3m1;3yE&wE42pB*E!sQ$=@0M>rS zsd6R$ieujCa+08oO;738#@{5K()Q9GNCnpUiaWg95%*yMpE*1pL`(|IJh7WF?v;~M zxC=h}T`er3J>#Uq^PT;iH@E1h_F3&~TFI7S&XxiGpnz{}hLp5e)qneYh1Q;0$oC6d znx=_Xs0A`IbasFuAF16B+}G8{qs+bv9GF@_;{S^q0q-Xv22EOm6|&Dyh;YHa#7jee z5&yTr{$xkmR$VY#yipbvl@crl5`$Jfy$(YH69Rmq#-z#q8|5&3ft&DN7Oj}(X15Am z#Y&kSvC6Wc5ORVTdG6-AsH!HGri@<&!ggoQ-peLJs!x6%Bv9l5$5zt;KHbl27yi%J z`yds8$PN5H8;*dk%Yib$4#0K_WOG{QotaPUZ-~83SPUxAn%&?u_VvAic<;U zmyVG^V&A3=&=(Eg@u;-c74fh)AI^<#$;3DI%}`k%IG&$9+cu&AY=y?G>cXip7n|h% zFS$Eov$Lv0XC_Y<97p{~!hNm3e0`Ha!x}=>+wiRAP8o##9VMRlPCGz|3+47JtP4OV z+?Ew@_Lg+ms`m7AgT2tf&<(=}v`eYz((fj^QWW$m^-bTSmxhqWk892jPfoconqq!^ zp8dAeCPCIBy-`P#_kcGkRXKi)gQgg)pbOvNv51E%W{>XZacu4ylidg%Nny@WNlRf~ zS;0->5IfvXg%|*7)8_MMSZJaEmDs2vQaPs`({vM~!k~NpiSE3wWXJt*L0-bUUy#4k~>l`C)k%TRUr$ zcBQR07?rHYZ2n%MVLYM2_bgeM7 z5<25?eFft}J~)P(=B6gIot@eE!RC>R=i0eT#7}ayNiD|zf9W1p6A-g}Z0>LN6$2n}Bm7S&X(a=5?dagP# zb2*zB#Q2$OD9Pk71&e6Vi1y^tN>Sm@T*`O!kJprbAlSWHg4F$J)RR3TCDHG2sVB(7 zzk@rV*MISi_M*P~h6YAF_vsNeKt$Pa4#5@gjqnVia{A}CH8{u9FVPa>pGr$=lUype zyQXAl?tm^%^@#EFA7zpv=JBHnT5VqC*wV>9H6tz(j)sS!wSH~f|X%0*4E)uaj zUAaTZ2ERy|AS-reKYBBp)G=||G)af3RM8n$We=3qJC?)yJe5?*#kYnDT3@jlkonn{ z^xYS7Y-*IcnPJ|bChL6JZg8G1pl>rGScry2*^y&ewdf)g@ig3+$B&jZPuUk6M*kWb z+p%{%%lgB4jPvw1LdrA4bM_PTSsR)L*1_DeL`jp%VG_8faw+NP;nI6iO^x1GfUik~ z$UwfhT#U1xs7Jx12WI8~{$;S-cyb8kNczMhg|~a1DUlqeIi3$k zwD4RZ6MP+97?x8Pb03A0(lVorMB6nI(HTnj_ItJXC{CF7<8TY3&dkXsUy^;ipWLME zCI9?}xE70xRR#oB$OIuOoeMpf>bwUg+*H5ROzp6l%XTrV^Ibqw+80~2_(C4MUVkhdWCl;DE){S0Oq&N=&zG0gpjzonDR0s4pQ+fVpk(8#U>*Dk|Q zjLikx{GdbnFGB{{B13BhBx>kTTpbq#{gedGM4Jq+_)iG*{g>Wgg=LGNZvl^bRGq)8 zE+1iu7u2w08kV}^HHew@Q|0;MQQNkNFZ;bguDu!~OpX#smd51hRFibU0 znr`|biIk+@TuABW7~a(cPgrJ)K)^5#suf*%ON(eA%ag!k2mh$sWfXCZjvC}Z7T36= z;oT`lGbA!p0)?N0V(KdpFAI!*b7TNx2My}wmb2#9)Tawpi6Ff$j}^rv&DF~LHk;WZ z?wi_rdD1*Xejw~9a34bCHc4J&Z{UVd#C_Wh`0i>;(WlY4Kz1l;=?VXXstb#?An~pD{x)zV7|E_7BT}k$ zI$qw=RCP|DYCHpZB53;sjhca_xO>oI{&H^`XQg2}2p^ggKoDj82fXElbgt3pQs@lRJwG*3<@lE;@Y}WToyKmCkY1nkS7M z8&om>66Goz$EC+L09(uY&dq9wZ%&CXYRB7Y=k70}-^)X2@WFIgrK>sXkK!pGXOKGH1n zB3$x{tK1?1`?Tap=7j;j^ zSYVxRjKA#){J^Ke#O13rMWHn2ZOJLcj%k0)&+t~+jNa6(If>M9?Ag&jxZ&_&Lp5Ay zaCkHCO99Z4=aHt+5eN8Xg}NhyYx`|&*__J?gf%L~fcuEIv(v7MZWx#R^6C6ugGA)=i`D^J9I% z1uM3~@9Lk$08IpDI`~z0KDBMOZ3Q2$=ojn#zJ>tlvc}8(Rw*t5Y~UI^1SI&?QPj+2 zDX7J&cx^V6LKsd`xUA7W>=#SipG{Dlu2){|YbwXU7}GlsaO_54(_vef1n>d4jj62% z!D=Dg+LDh=+d_@uZr{WjR|bX@2*)T7t?_#y2?UqW3ensvi1=*10q$xV4b+jo!8gO!YjDwKMW*@g}8Wnr+49%w0x~?gL4KceSK4L>MkT0 zvFhO4@{!*vo^B)5&YjRK_^+sAYDlm>|k$Xd}dC`p9&SjCF#6&>sCD z5pnd%Py&OMMwWP3Ru0&;Y*bCP``%3X*D{bE9Pa@y+~e3?tik)oC;!?%{ttzEaDtu~ zBmxfy1FB61@95q&0-U3O19FoLl?Iz&X{Zje|6cU}g?$akQNE%OTd8t!^EA$RRbKED3f!;w&d$y?3y+KJ)0&M9AOxNi zI}GtJIemo!7*Kk`kO+Yv8>*3tU1<8KO(A|kYvq<)I#G>vYq60+zZIvdmd!P+coLJKk$b$6r(m(Z8wYbY6;lI~*DW<2gfv_=0(cA^ICo>;?AElt@OZy~DNV#1cw; z7>epIM>>_9c+Xy(jZ8B3ovAx1y0}MW-0~V4Usa&8EIdr33wP9xvaw+TE(_Zz&5UC{ zG*}qE?=!qC=)stemHXPHcLO#3gP}w(=bC8=m3TTEv;Gvs6@Ahg0S_d$vs{{ujE+TF zopT~g5;)K8VPl(wZ#I?LfD3ug(aJ8sWh{ijN{KFKGL{sp&x_-?L3iDQ10`^7EZ5%{ z>ytXmRJJ}YDUUk+pOs#R$$54H{76OJ#xzeg(3!6ZcFnFzX{MBu@m zFbCx|9P@WG1kQLd%eeq4klGY$>O42!c^Zl>v6)zN?ItVmZ;6@en8q@R1#r@}3>=-qB`7CN>M3P>QpVbf_4dII;3)yg_@zDP#UiLwc5^;i7gj_&Tc3 zlo{kXD{orKpsqXXY!DW|XR|&&6qR{LOlw?x&+0sXG3?7_Ul9Wq?6P5`MNE zyF>XA^NE#6%MyxHG&k-)^Y&ch^2Uzd7Mw{M5)M`28I9#V8eP9>=L}~$d~h{y7jV2IFQ;dJ z;Lz>ykxG9MVQIc2kHai1T6B#yx%{JM*|qo)M-cqTzWFPC@%Qun8bc?yhNlFP+!4XG zv_%3iU(*EhX(?lf;1q$}Yd~Bc3K|On4*c`i1N&-~j=|6NcU#1^*WmZhzk=U?eH5Z) zD;iMuYH|9iQ+6G|*ChEX$o}_-L5>%26d*Qdcnr|`1=xrj#Q|tuu?dndpQymtkN;-# z>LlPPTBH*JGOrp;IH{(>%;12E^k1r1e~k&d@Ylag;OmJ2;C#ZXnT5Y1LTMq(0(^bVF<+_J)h~dj5b&3A{l`$9xLr(|GWzzUeyTyYX~jTRe;3TJlHvn zq0T3;tDr#tZ|pyM|7ZCBJNJKN$6T5LiLVJD6-s6Dc<>NjJMh1^;NKSj-=Ls`WOxQp zCIT^Bi%L5H4Gw(sYBa@~-+)n5f2H95LjG~7EvbEgN@#FX_r7tDN#MKc-SpYXtPm( zc8cyX6m(Hxz^$kxeO%W7j;;vF9(jT7yj^|jdGly-^CJZ5qX@c6FY1%z&s>I&upQ$yMY2dHtoQ>bmGXWR<-=Kw~CsS48cV#0( zdbf@794LvUkZE*Mf0Du@staZ9A8}Qf9$O`AeykCN=EvbgdPIrR!Es??sq+NIteafD zjY8GdH+Kpd3}bq0d{q}%f$&!IvQ5OY#)#nF|4oJ2x7zJu`xTd~Wb@dPI|U)5n3D+4 zv1VY&b`VwU$#?qkiQ_fN$-316X!`rf@7{*?`Cljoa;sxb(rh2@RRfm&y=iLwzp>p> zwvDn2yQmS$&%ZWj<2J%|rvTI) zH+P#OE|WPp{3a=EgiBU6@%8#}4RWk7d(s*x>x`8Whn+^vH2+mmFSpEglMcyUigPYB z%~hPL)<7T~D=V0rn|9`FeSN}ke!CVI-VAM{{_=fo1?jY6Q4DlQRutQFtI&G$N_552gMXpcYM*}0ZG zh%RUC)3L2gMa@{&Hz{JC zHTb2MM^-a{;MlInJ8sZMADgTENPW3{4O`E$Z1$d|xOOi>(e3+_FoRLO=-b+i`?MlT0p2m4(1E6D`lYv4K zqW{+yfc2ErfvWrlnV2w30dD1{a|FetTTT*xAfy&%&s7iu+RCZg~Pp!fG&$96T^deNv{UuS^U+lV~R$ zB^#r0A4W(u(miA5JX!QaygN!u#tZa?jk^64EqMR2h|14aQ?Ie@>qDTzt?qiLT69kM z%o;~9$~Jdc&nMcvA+=h=@R^#TV2VytzQcsd5)!4)AJUmP&M&#_6FEsPxz_1ygmwuo zoObXc=e{hS+GWLkv}6w?C)$R?P>Q3CDA|)yLDdk;_ad1dNjmh9Q4!y3O10Q?LTTlr z?AmnQ8aaL#fQWrcOnU=V#ztrE=;;x(9b@mZ@#mbfB$FzAmP>b;8Pksk?U^Wc~?2zvX|J$Se z)6Ho7aWgHSh5>}HtDcnWtj#^}GUC&}EhE6RO9&|MsBVV!^3q}N-6nzny{twOD6)(O z$&iwGZ7F9%X~n3xth>&8WamxZ3D3)`BGF5m|0tCefIP)VNr)TBSytoZs(-ZZ)W2M0 zYrq$Muv*BhrrXy#^5X*da`SWQ$8^rdx&H&@C)&%1XzoLk>&##%#F=n^e0VA|q>u3} z;vB&2;o9IJ4r}dN*sxS0bLWAm0$<n@DsRsP;$H!<-(`T*U@dx8QkH}3HWcvo0+F(qtiY5MI$9r-96Y0AZY45QXeok_A= z6KHdCY89ZeFZ}pIj6!3n#W?=B2H|`pKIJm>qGC-YPtvIhTIJjKDv*gf?u;`UZo#H4 zmdC$Cs))2C0)PBgDb<*e>SeD>8Ev)(8fVO5UN#psq^wuS9^#8PMbf0~Z;C4>Ga4Qh zHJ8tRo0OE}HuW1+_;oejER(_=9fwwKkAcSG|)crVKU|7YmfrAf^9Akco8^yC3IFvu7Y#$0}yhmG?+0Tl5Ku}{@1R%xQJ>yy+)M!ou5 zzVO>r>*o1rCsn!I!d9p{yc=B8MKLeeIv&!YF+`)rUmx^{3v)JU*ynVET@T|Vcz+PfxD&6C&!~LmmEkgYo0GUR!I3^lHxJb)z}E5+v)lRF71$=@t+}b< z+7-w=mBG&lnlb}$H+=N4tc_%;gp)3Bb;DK_l2ZOb;GLLd*`vD*Us;d^bz=4VQTQ3T zvE*4{!+v|#kz#q`La-{ZZ88as*KU?fHEvQrVp1Zd9zyJ!SjA?Zlv-tG;i70oH$NZz zuqG423(^6%Of{h+e|KX+I*`42il@1wQiXlUaOKc2p(m*sad@s1QhBx{N_!<@PJ#Xz zqs8jIIIRZ{5D~XmCs6QEPcP6S94}GCp%nUpo69#YeM@$vQEw9wl$%^z`vChEnOR4p zZyN`+vDX?aPi_JK*6>ka>e(QBhxt6-A#TG!%r0v9!pS!jnOw_Y8|VRyr9^FBlEm;= zhL_hVPBCbaVLAfo57XA!mb9!BI@f;!maf~J%o1Gt{8URD)C$bg)BeyGiE$iiu2$CK zVgt9{C-=6MKgJlrO@ddn_;?ZHvs>^c0fQ7Gd20sSDK%13qo7=T%twH;<)CEa7J~a0 zgRF0W@FRlH74q^GA~63Ed+m{UdYk8dM|t21*ZUNKm?pJGEy5$dOG5Xg4invT)IFiH zNi8LI4mfIXyGLFDI$Dw|%Ii~Dx<&C?wpsd#@*`61&B-M|*yNcGv)Y9@^LMVK*nz<< zJoyVv!cqG3y()r1%F8hg%u6>tFM#)V@DPTUaI5&z=b~b$_zzbK)DUU512QJXB^}Av z8aKS(1Jp&%Njv(%hfVC(j?>b14~=EG7fiS6DAL@oRPO|1)O7xae2pLe?07`40yE;d zzhrp-A}oK(>*zpacVL2uJq-}V0=tGUVZTQB!8*Y(H2>{S{sH?_vG#}L`Q8y>w`A=A zXkOWAO@NIJ71*u3o`?5;u`AG@O1b|Ji_ikI2cUSx{-k?TgayWK{uLbfN4tL_fq!C_ z*86~>S2hk=#xwG|zhNHtznlEq{rx9q`3VioL`80i5L)!k09&to_M%BN_*Dx!_uqn# zf7ql75;35~{R*J|8ndj+cQEAv6TA4oh}}PW`e%k_Ziuj2z~ndVb$|q`@J2xJ0P+8A zaspORaY1Nd0K}H*2Y~6TtEQMk=+^?ziNe1HH~zE+X8c$!-cJCF*G|URV2BxlJ4y7{ zxBriMd98W};Q)9zs+nM#PtM%UI5Ziu9Ia^v9v0{e z%_Mi{MmAN8);4t^T2`71F{xTtkzciZEK$$$Ixn7U!%|+l)4q?Ib4J-D8rE-gcwGp- zT=@Kc=;WR5y1Jy4Xq4cBu@poG95Ov|MAZOmJquIwZ!Ot%rK!9XiizJO9y*bDQHUtd zsbj<>#~XJGG0$>h_-W=_KyhVt(abOX_(8<@Zo0~0VzyUPFwbF~o zaki_%TK|X==l4GUV)WK8?L*>`S(-oDJgV6fdfZR#;`gTBn#DPnE6U&ZrcIytyMG1( z4gKloYaaKOIDXNHj32dd{8B33XgGLR`&b|W+`KeRfJ#za#;$?^iXmN##^V@WC zsr8N(=Qqj>@UVN;+aUipOlj8oW_H0y1{qGEK3LJkN48%0aIx5JYObNjh zrH#^xmUiCyh#9kwA4IXUzAUU+)8!NV0_IJc>+?Qkz-T^LqfajI5ZF8%?&H|8;lxy2 zb)MXY)5v5pj*v##_&t$$+QbmRt8-7-SyM%b(&H$mehps**ohNMSjh5Or=}a(e<$o; zxjJfTwWfM%eAJ~RI+N7)w3|g<)2A=3@fRu`y~Xq9!Xi=GfuBTbTAtp&LtcUY0n{z% z{KQqI&fADQ+DpRRC3&_btK}-yZ*7`Eu=Hc?=r#??TWrQE%hAHJxQ&-9m!K1!nWPV? z(b2Mp%OtPYbYQ{6dKIbZDB_0SOwS~tbUCW>>C{yQ1xu8>ZA(-z&v4-A1FG+@^zSGK zcI9Qx7}Tl^GNY%xHep7VS6{=^Wq_6t-#=``(@vmNN_8kB+gJf_IEkTT;PY!-a2qgU zh4IuAM>GVcOy2Ns6lExK`}%_jTsRm|OC#R+AS0X*3W&Tp3oIm%HTC-TtpU;1&K}}M z!j;J^i(GWDJc3VH7PCuf)aAHhp2n6m7A0SOB@lx74s+6gQ+ay=UJp_CvjgxD$=qpz z+F=c8bTx)Fdc4-ND$S>{@?Av%O@Ya3SCuT0i3(2v&l|MJG@}~g9(P;)FSM0|3c}WG zE6(jw+mex;9)u_@$0|w>vMo zNkS-o(APN=O1v*n%LNG^m{BU)?i{Msd1?GnsN1NCoLG?Qp!tj-GYUpMwHs;}IEP4j zqwvbag!A?DsLr$wt#Ot_!;kXC@`x9h4})iqY-OYOT=TZ9Q~VCAWsfuIV1J=87*|;1sd64>x{69_ zMC@R5&`njPl}h&_y19^*&fJ+YxY8TsgtIGOl(^lBAP)DwR5oaE}Ph24drWXWG>91>5UQ{Tkbk3j55?teszbJH^s ztYxQlmeio@_391<4mL4SaE-|0Y7NM4n`V+AtkEcGNpxEF;5bu~Nwz*oJ|2%uE0jk{ zh1~ZBpBDx(ooiWkGk5iDLqx53Z8k8?EDvwVJEVODBQWQ;>IPrE4JQcbiHG@~3h z0*Lt4om>Ws$b1AphV9bPeT(7m=6CiNhUNfo#VKpImv2o4+SZ;k?%kWU7HotMaogVM zXr&lVFQ3H0)JrJ04t`3R7XIuk;!zRgX9Z1LfS!D$$N)&roYoX=a3<9~ zHNVA}Aa}6_ayXfr7u$@B2ziqOQH;X(w_SjOZve6y6N8~}${Hj>6-Nf1xUMA2FpU@& z7gL^w0UIdt-JedH?lh_nC=PSOMeeuHU>PXzr_+aukMkLRqeTqC&@))-r{?z!SsOu-#p5@w2^2n>zA^$jaM{D2#_aV$6)S@CU0NxzqRz7CncSuzGS{@qF|e}C%; z_YiXr`&(2td}p)yc?|&tHIEP>iNQD?9$^`OC7HavioWzdhLJ@X8Agmb^B-09c59{@ zy7XwSz&tbhv6%tIUihYgUV7eQy7>IWARUzz&fGDUg{VX0;kO8OQ&x8KCWWhVk|BVM z*!a1@bsVB%HBov7!Bm(w#EPajC#~?c)8GS`?MPX6b=!m2gW${_eONnD*@-R(4<%$h z0u5n3gqCoibKDt2Ld!aQQj0xMRV4?bu{0qEfll=0<$NS(#r<4Kvl>OE-r?5q6O>%c zk_}S5DLQ1$Z&uxP5z^!K>jz=JLVg6r?K_vj93TLc21X^Zr%A4?`PWaen_5&<&w7_n znNCG|vMejKbJwGpG}?O0(N2G9;h453R)ZJ&ZeCdoUW?UlVU3hzFwK>Cj9fhi=)-QyGMXB@ zkrlhKd`|TE#Dz8+7vWSdEkTQ8V}J1G+N~&!bJ`rmUEFNY7l$JXvkliLZH2auFHN#@ zO>mgU3NNqCiZwOAZUX~^1C+)AQm*-82Fx z4o&dNCG4<&s;`Fnx2jT=1h333ItGSc@`r+230{&tOC{cHUb)-4CCik99>vY&Vc^mJ z)!l9Msent8wD8?5t^U60x9l{n9FQ?lFl~wRdG_y?tAQ|-Tn+H9dZ7Fk;@mmp{)P2U$8Z4>JL4&?O*rAj zJ%ubctPLptRcYEe^60mpuE;HgWX4rSwdRZv^(ePlp%C^_FY+`|#>igYhJ5~X$FzHm zQu2`;B)wHQ11`jQXOa-X_@hg9%Gz(e!5jKpEX0xto*(26<%}mrgC|0Rw>dDJ}^O5EYw>)e}b-j#pNk)MgidEqd`7zPODNOwBAkwuA zi`TtR`ys)_Hg&5fe^?aM&i(?I1mV!LCya|X_i*Oh=`imf)-T&G9n7RvNA%07ow()) zr3W5u{^#Hjc%fxdO9ndtF&cPrtTxr~`7Li|j5GAs09O>6i@M;`Iux|DoZ6ce^a@5lJA`OTJ@kd)7A``tW zIb=J5k%`AJ6w`(0!&~g!X`YT8X)=ncG#w(lor9gxH|yIUhJM&OC9kNGdylYZ+r@mG z@OYQi%WIKfL=;@n|G7WRDd0eWagMYTG+7RCSIu$gFf_H6_~hi{u@;?I)P&X#nZy!fLL9KVOwzf4LEc53%fFw5zLed|DuBb?4dj;U>=UXC6*el=M|J8SGS%9 z22uV?A{U(I{WB~Ocvx^Cp=Tn>mN8nmpRaI_VQPyfFr4*Y;kvJFvbUfyz=gb0I`&b^ z()VD{`+w;u=+D89V7`m`IyI;uWJNdt=!_9=6pSA;*Dvk{XSk`s*Z5ze_4hzQ|4X#0 zeuC*F5;I)QYxRq@!h(Mlxca5wFP{E4wq=$duHm(#$3uy`%HT#k{_5yIzJfn&F#Z=2 zb<3(C+@I5yJ`y!vh=OyT4S$^-{tp=Vu%tgFNT?wA7b4siPjNVjR}$Ge5`HBHCXr$P zM$G@eJLb={paDN(?cF{4IGA&0Oj3!E1&Dk?tByB?hjb49q%RsvCDBI?*_X&<>eL|X z!Ata^X}w8zrF=10`@)luj!FWnkim0N_e8a-sp;K`U*obj#Mtjn2XopCD5T}?bce1V zu@9ZkkLG^+D`5|iJ=#y-dTb1GU(!%WL^@c|fiX+8eH*|_Sk#U{WD-y878>UZDJTc$ z{&&Kgy>|AVOUM_rTa%9&5*;uOcaAO@xAvfY6svQtOBP-pZ!+YI&u0%ZE;U>a_@3PW zSZx*3_mlgpp>4b(JCb5}UxKJB1fj=JKr}?UT12G$4SUPc$ zedRy?)JzBBJpxHeds>i9l~{VK?0u!PFWRq!y})(nNu+QisB4c2gzwyUXd!pid0*uB ze>30Yz@M&2NaT!r{Z81+k-ah0xeg)hcHMbz|8qGeY}NByjP&Yb3}JW5Xn{Q>Z(c_D zn}mIuHANO)YBqaQ8L(z*KG{=QhS0U|tfH(vht5LsX&%<`R&n*yBa|6gNGDs2n1U-=SB|$vGr?4?88mX7 zqq(Cbt#Js#Tp^K2>0=ayR`pw00elAO_;VA$Wb@Ao6FALSoWoYJq9ruF_UV)^F39Nz zc|RIOYMIze7odE~nBa$^23U(iINqNZ&nH@+Jfw@sLxH0pf4>$m4b5Xa%>c_#5CU5CWMjVlR7Tl=?mY9JT0%h525s5U)&I5 z9`HG<3)K0lZiy^muDKL8b^V@v6CZBW#-^e<8Ja@1H=u2vGxj6?J~N^K61H1XJ3&0(m=sz6QFU`Ac=2Jo){o292fPMuh61==XLE>3NdY6H@H z>D2yn2*mzjg3y_oAfbcroJgJ9cTzykUtLyNuCKczRlTmp?ZmU9hn zYn$hA^^Xw&yK5v11&eR?ZyHGpHH~w*?Ls%5^a;hQ1>Qal-_y}b-Kqcn9mn4ceA-AW zj89bAiPKuDFY;^IlwXvaU5qTPxn{cmDObthtVxK)W(g&Y8}zMJI7PIZl}c(~ z%>H}IJ%%u5>_A(+27W_ylO3>j!yDK*(LIWvc7_UTJ@6L&X*c?KY_#YqHm$iJ8+~uK z=}wjZEqAlfx*^D&;HT043a2qK$w7_Jfvb=fzCsFzE&`H?*f!1pKi>Nk7_!bzc)PNj zm7gdS$!^du;xo7%-cRM_!4P3CaFi|r4Q)5!6b!o+TgcThT_1(tVNw9y4+`xm_J{;R z8WglJ2tkh`Y+I=#m+1AihzrS86gvs~m6yywi{$g^gqN z<|Siz-9u6u(%YjhEX5uOqxTV&Fe>#Yf7VGg?@6WLSnYHooN?&S3}3tUB)laLfGMd3 z9xYylr*ww#CA=s*fHvr+^!*;sH_F8y+tJxDc=t;%__G8l+NQ3?LlaLTDq`@s;rgRa zF+;vO7PO*D7+D|}iZ<$ZF6 z>Y`RGK5fm>aN~J3#YfQj#vq@(+zCT-w$)iwvXQlRt1T>?%0uAa{l^HnImd7Ih+>~u9QYqSr+Y-Oe49#tW;URp?qKOHeStbc%p}~rXHTVCaeu5QH=jUe$LmZRqoUexOva~gyCU-Nv`!rv3NluJdyK>HihV*?-IMXdvBJu6 zsxxrQE8@yKLTq3>vec=uvLFKNbZZ^YV1Y%SN+wP4^i|Dfrdk;VS&yS_sm6$^>1!+0 zLcU)?`3uP==6Et#pR|qS6l|}3s&?t04TPIt62=u?>7E*9CFan_T*Km_GgiZT%T`9x zwTrHhVxAiTg!K((D~(y_aQE43Vi4lHr$OU!=CLw%SRNQHl+CD%lhr%4O`1wrZ=1^u z^F#amQmgQ&{hkW0-=dDsra&iU;;!`FILM536rplF(aBKjM_=S1f;#4U$b*7sPFV=B zPmsuaMZYiF@mtB9D(2fzWratCw;WqGRxiwx-KM9Az^$2&L?iT#vIp~VibR3mX?$UG zGA>CUS91{+p5P5E=OjIgL~%1*;SH?k%8$_^O`Gk64;(m;feLp*`6ChE5$X5!R`tFyno7-u+Z(mj5@>uD+<0h_!T*K5` z#`Ynw>QL%rS)A+=N3kc$2dg=^Tbrcn5<+7p>zo*PPC~weEMm0o0qcxC%yToH>gfS^ zzS-d4kuONiA^lzopT{^Gti@AaDzzW0Ijk77VpJRh%SvLb;nE6t848bRg4t=ke|?o*fPxNmBcusD?AHESx{g45bn<*0|I()s*iZ zK4Ssz#B#z4Dr@SO$Ie$1Z4pIj)|63eTP_kGn~BxyjR~1h;CSfIB6yEPw~oarMgvAk zEasF#I_juI>24aY!me(-VY*!zv&ODrzzd(zdUX^`#Xtg|c5t@r`6U*zND_mm5bbJ}&^ng6dqpQ|NxXa(`nYrxo4Lw6?Y|b`HfJ zOG^Fu$87($+r3H@JZU5{L5da?$02$WNl_=wS-~(G&I?)C>JJLN+eqPUGf$YPJLqeR zDQ?B(IK2U0=Nm!q)k4|<0frY`ICnmUc;C5PWSVTMw-=ve0Y~&n+2&9IEt{mU!X|UT zhTBZhZU+e zcLsgeopFovOZ=0gQ>Z$!cLph?0w04a@FIt%Q~V;`lO@|?8)i;F5L7SOROe95sy4}F zF5SSfRQPb{$8)!3Vv&0L#*Z$@>)0>45i<(^`p24*Z@X5kyOzzK6I01Kl{4JDf4o+9 zFxvyrjXK=%`l0=s1m5>axwND(lSMb8mUa)Ai1=l&$u5xnNiD<6mQKhRr@o8}tXunb zys+1~5=;Vmcg%mYXKt#&+arh$zS+iTfQc8Jo z?Q=~<-`u^DH-4eQ20F(!Xx9k>-8nUCTXiXl+AsA7RIF{NhO`a&ccb|Px=l#ck3Z|y z6>9aF%MnI=6;W$+uLim>l^54#wztb~YEnCAaE{|%RfsKJnEaA+@US5AFtX8jrZ77W zRY5J2ekQaoxjivj#B_Qf!FA2?S!<8_MenkkRrmi8_Lfm`EnT-T1Z~{i-Q9x(cXzko z?h>GJg1fszaCg_>?oM!bLP)sHdA|F;_na}F^Zn^Rz1LV(wX0U`sx{Y~AOB$etb1eZ z=@6P*ey;SjI89~uAw(JgA$3# z(npng>&!n+5ZU%>9WKI)?xLB!dFGHoSq22UU^mU@%qq|F~sn(Z;PYxi+~L&nEmd0cIuD5?U5csrxHfHd?}48h3BRO?BpuAu!D_t zrI_ePRmh8>zf-1(u@ytg^g~)hl*~G&25OP=ucP@G5ME;3&K*!4pTTZOHhU+7f-?i z)qiqFKIL*>c}67R@X{+;Tun^y{+Y9^y2~G^^66;r_RxGe^+^W5dH&63Z-Dl#q6+aF zvv+2t$;ZbpX^AcxKFmYY{4re&P1p71vn~= z0Nc!NL8RAkop7+gP}gJTC-RLqAutk8e3b*}>|f>1rPVoC12EQ?qR&!YK!jYLGog?i z=MbW&9J;5|)3DOqzN6Eh#19m0JQ}}170!#lG*7dCuo(y-_ZdI%oAdx7w!a-I1J7tv zP3m0Yo)ty)AN14mazfWqzmIREjb0J?=^_F0ZWsIG88QFrWqr;xajs~S6l@Sb_T_D!tjr) zChGKVq!NFTO=&?8c+4oE(#?kvF&2^NM><|b=xXk_JSq8hsdVzFvFSH=QP|%3(ay`- z8~%PXHM0l)<-q(p9k)rAePfDxNg_ioh6wQ4DJXPI-ojHS!&GB4=;XApf+%a5{hkv z{)##kguN@`38*&d`h#in_)xjZ-DficTQdN0jlBYJ04Z3gviejHF@)__Ar0sfhPLP+ zXqp!MZa)p*YJWbztL1(S07A;`&l>OWjnPoyq}dx8Lj1}Pz=eKKb#vcx*sH6-=3WT7JbFvk6H=ky#BKCgb>o=P~T$1iwG- z+%@Uwyg&OC4By^w$pLhXH2rBu0Dt}YI2xS2R_u`X)-I(~k)>G6@K#SwaXNPvm0O zdlT1j7a$J{4*=6gl;Qj?elU0@4v7boy2t(fkXORT*(Kcm)J?TBi?9->Ng|pV-IxjP zpOo3<808#~Cmn#HR=CwskUyqqt5^h3;i3_OLIi?VdhTglBR@_!w)9r|w&8}F0Q&LV z6)pPYGC9p=GV9=3aPiYPg{6k@Qv4VbwP9AD$(Q_Dei#Qolo3(wn5PBm8e!!?*rXL$ zzXGyCghKH;!MJuq&V86vZ1uh;E!F;(Gr4erpF|R!_5dlH31ZbN#Ghi)hRQh5b#M_v z4_Idnn=)Z-$nb}J0Yp8JWK9XLD4i2QNXXoB#|^(8zH!{qL}473Ry^U7LD>xVruS}Y zOJ5YR;YZp{dIyur`ZJAfpKboaZ%*vO7NzYYv%-kF2$eI2;HPxq@T!6{zL+kvk zGU$_D@vIUo&ZBr!{I$xyyULPihAoEWF)WSvhJ(@QL4$*GYLBGfc<=#PBc2!0U5Z~_ zq@d8-B^llLt++j2$|IVD^$B`@@VhaC-l)?#w#)2b=IXea0%RuwZK^_^Xd& z8{c!|BMkFPE@7vB{8s_5=``rH4j8%=-8k&j!>a(wEGPzf{UwCbyB#UNBBrAf+$qaY zOlMFLtS{`Z^>{l4ZlbRT{+eXAA%m|A>YdZz9UC7$iu6`H_rleTXK`BGwk}KjxnEeE zq9f8BNRP|OC-!HsXo@`=nyrcsvLM8ZW$?J$OWRjJHv%eqg;T;^pbq)krSAC=u$tWr zdYU?>+u{FIcJybb@uSh!Mzab11}(KfeH^_2oL>((WlB4VHZ^}OUy@#f)JNlq9EheF z%jkl5_1N1yb?j`49JrC0T3G_v!rwjI%ARPHQ6c$YR#K9L$c2{nkRG!Ki^ zPpEedtMK4P1~BQ)e*ph3iU}BJL$l>|R;)9~!9PFJeq^^4vN=D3{DoVe!#ZPa+w{8< zcmY;e4G~4GJ)NVPNos4%I+qi^GR^fW;RoY4i&T5|akr%m!jHg0%e&G6pIxsUJv|nG zpNH<-U_mMdP>%fGmRc~}%%y$dD_56W3HME$i)R*qW4P*MEvfTHdxqZPV!}p;-l&um*(`b5%Kg!-_`NLoD3t+}^JF>N3SDJ6 zFEhLx{>>^>o6-;`24e;0cp|Y%K(32I<9o;}zZmCZ_6!Nb8Co6WjB>;RZ5`h1Z`lei zO-&q%>!08oS&}U+RLk8-ldUvoL@qSds_lyB8#^rHA4wROGOWUzQ&X&AEYlzPv#YyA z#+$fL5H3J~@86LcR)(|be6!Y@qJjd+OQ*lfRi;bm1X5pLv~)_b=e&K9fa+&vjlzZs z7AJymCvF&vC5{T#kkuutTJtcHqX6d{Pw*g?bTNYEoP8qc<7ncSLbEYN>tPc zMdD)3Xv)tg_qMJTL0GWQUnpEi)-_q>OaW+4hSzLA0b!7!84m&Hvhr9F;x?d6T zXbR6>i4#=XuB}h za)pG(YkkFsy&+icH0*12Fv2(r=Pk~<3UAW^pZP~0o|Mio> z#C}9a_Pk}Orx1u>3HVK|2PL0EvH!bxu~#|vT_M98*m4}3^Y?lmb$l5%W6iL{;?l7J z*`Zk{vkH?@wYtUygK)Uu1&y9o5N;O3#Rd6o+FEi~sQJZzF1Q4*;1{iqCv^QkU%^Vw-%E zQGn4;U=vCd2K5s*vqNR;t_M=nC6VI=3pO4DZmeufDb7-(p3*$c_KZ-2Yn#B~il1<7%}5ZgB?JeujT`&rVR0`%rVDHI;5M7JX6_!E&HXXg4xMd; zu~#N(6SN7?%>-rz{=(!*ceA9%X@plP!+lYON66n~$tDV2Y=q&OAy<-(6-j#R$Kt9O zw-nNoj}?U=^j|+A*^pK2bN9w`pJl&>6@agqzuIN=Ch9K0Mm?ciIKh-F&~&2d3jKM{ zhc$!G6aFW3{`g8u&S4krMMzKB!IZNrNZA{kx#a1(^d2Z^AWpo~bWeJj7wbsu8=*Mc zbEEx2U|7U_E&qbIT_XAnARJ~sfd%&!rSctT`blGEBQ?M&&s&V22a_tyIaZ0f7094h zKGw2qTts)LcMU10nF_^+WcF0FfpqEbsy8G6;jky8YmR;`TRk>CxHv)SzuOA!=1$@u z%KPG2l?2r0*m6f|*=Jt$QoFHw+QU2!Q(S4XI}&jveBxjt@9BNGX3QmBMmgax)i8Fm z#eCv8(9jUcC1=SN7$i+IrHJ5mq;)`HaSVEyhQCIPYB(LM>GOr9S@wlwdsqOM%wtw0 z4zSJPEizZ>3DJhmF*BO!&8S&79PJO&--_0s-v!#sv3GRh!#mm8Z_*^Od}?DtI4akT zqiREJwd39}Fh3XreNMu=_hwf)VvEqjJa|SDpJ}~rn%q=5#+p$A=6W<=o}5ygdMJF5 zlQ@Zdhu4e7IC=eLo5LPi6`+6Z(s{D{L6SZj@9rVSSp!o5W6$s5LQ$B7?)wmZ=EVrV zWDQ(ZDn^9r;gVBshTW(Id)YxNCMm7`wqTrw`5D9nSWGg5j^%P64|{O5!Uib(hKKY~ z-390D;u~*ewaE82oBBMv&)vo4XT+P&(4jQ5UdVk#g`Fain^>Qvu2(RqNfHbx);_eS zDkiZHL2+;nJQjd=L2o;UwUgS{hq_;XVt)l{(DhI)ZniNP$|pz6+mAU|0|CXDfx4L= z1RBY33gkn4?C_$N%zJt4sO09%c|B}I)3zG44*im+N?xdV=>yj<%JnYA_*8^^3ieeXWkf(49lMzP1+p$I zG55FJ%~$R0@O5{Tt3N$4O*;hm%FEs2q(QUuwCRJ5uL_!KYMhY-;kJFntone~R6L`r z3mw!rZyf9n9W~2?I;Sy!V23%eF!dRDpbJ0FDO9;YXPm47b=LTxR0u^enwS`+9e%Ju5Fqvl_)crpwSKYz#ky)WpzWUZdj~z{99r(c-UQ-RPeKQ{%Q~Kt zY5ZpYte;*46^=D7xmx+ima9tKa%ksnQ7_=IysRc~_oI@O)PSUO#jSG4PNW^vJKS|l zjL#rGrV24#27l~Fy|QL%bo(&`*69bbJFaGoO_8f_8lED0iZZ8(OWM)rd<$$#S@TIB zw8YX*GZE>hjM^@aw++6q-7A~|=K&3AA7Y}mucEg%U>jVzPPHj)LS4(@pBd~11uW9 z?Al!jKP!EK{Zq`@m%8Te?%E@s+KkTLghfz%F+8h7udwjA^VyDAVVP*a#7?MsfoO#8 z0t~t_$TR(s!+t(zetXD6ZOg9U0IY`SS{`a{=0kOE)*| zK?&<-2m0V6FEK;%#IH}?V{clQ34X+1T`o^d>es$7EInyg5{pDUq5?lY$7WAA(dtDQ z4yQ-9-sH#h;6$YEE81~agHsI~i`@!wYT?X&KBGs8Kti%Mf;X1O?}R{-=~d?P21{VK z3#rV=Xq&A6il*G(nN~&QpIF(+%gNmUl|#2bxO!mra7kLDxL$)W4Zgo}u7N`WBV%bv zrz|`Pp5?_p5!-NK)dpM|XFpXfDRlX!CNz%e7v zpEwRrOu-mm9+gWb@jmvxm^^5mH+R1-YcInHHcd!dDFCG|ej*C5Eq;ORJuu`M^K zAcH?zSx^e?cQyd;TE6!Y-YWQdA9Xfl7iR@&uC31cK;e;0CNyA}Z%G_nbP>Hl#1t{q z4mlak+tvnl!P69L85th*GS>F2zcbxb;+8o_Sj=}y2MyJ1_IFka!@p5F{L@_i zKjw~aAWJ1zSd@3m)TnrsD9|b!LLBDwg0ii{tvEg!~>Rw4TNyIkXE#$0?8mv z+5C6&ciIt#WIaO67Kv}L)bF@0h_cWGN)T=<=3j7Ie_6HEG{e5VBdH>raXOFRInw_& zKL0>rfe4kzQhOl?(ORB+VI9#xW=x779rZxKE#`l5)Z#Y}JBbZ?7_rBA?+Xa2g$AOX z|8GOl0zzy3dW8sN;XBV$3;?I){LuXTtvitV{iiV8!tUmi--y zH$Ap&j`RP6ssq(Sy}uU8)Er49*cSLZSc>;rDX02^LoyJ=&HLYc{e?NZ?uCVI@p^zI zL;{)JG;kfjfY`FYi2i%$Q$bL=kN*MhDM1pF0Gkpf?a^6LM&9f}l>jnUR??tq9Yzc_ zl|dOt+eKMCF{NM>Kt7t(j(rtK+7z)lH5UJBpuALyz!PjM5L-Bko4!oMS;Vp!clsRY z$8P%b*L2M`*v7~OT14yNgqsCd_9~nsdoR~O1gg$$D|KUhxc3&{XQNo$6ufY@6#Dgj zpcCEeVd^xX<`0h<&7~~m1-Pj3kwR>r4Fz?eaT{Z@X97}e$mQ*R8e7E$1sMZ1&yd$# z1B4Y0SB4JtOPubO8tUTN;fPce!-EA)OA=Z;s*5S4bnF@%Ai4HYm1pOa0*lWTQ<`k<@ zH-WX_c)uO3;Vk``@S*B>W4@?`%FUtZb;JdqiZ?8>1gG?LEkXRAQ#t{08`Wt@3=GOP zPcW;eyuIeT?qt%SVNw)p^^e3&vZsb2h)ZasS@IasN~7xZzalgXJ{3zw-zble)plwB zp-0e~%dstht$`pqNoW@-Gv#8WW%olvYI-#u#}c92QFe z7>R9o3^9B{aWYko7hfQOg*_r|{BD#M&Q6#bgw1Tw>3Op^l!z^0nJjzKhrAP3?<0UK z%|a+GV`FVFdEfbT2JG>xIU1RE*ak<~amTr6-H71Q3(tcvozqJ;*UJD{Q5B~r9AiU90Wz_X|s089BSAYY#A%h*OIDt+G8Ek z6j+N+V@%nihS_a~A;|SvD)qdDc}kLPtZ!2iiUzGo8*lZ@4!%Dx%|x_jF;^!RVC-lq z)SZ+=o0pvfWxm`@KP%--%-wUmah&ojAMn8G*Q%7(6J`t0NiZy!rMdYwBye~+|@8{-0cx> zYj*4#ZqWqPwmZr~#io5syxM|hV}<5DFGk0S;WKqW^aeh6l9GKeq*I>2LOz9^q8L-D z<6{XKNn&reqS=~#4rte`_(OiCV3rY`f?Fg!Rd50c#&^&WD=e;kaPZX(Di+ z*V0@C;(w_nzRsaYo)zbPN>3DI&v^a%>6BjQgO)<~c5mo`aryo5W6W#l zvBjxfK3Itlt1P?a32|aF^013&IkbRHd6XP_AVA<)9ld!O&432rE01D82Uu9M7O`R6 zO-}f96qtchP1&h|cC3^?tc*g|6wD3RpQmYP;hXD1lsH9WxY%mgjM`)S07gfs%e2-4 zYjgE2f~#J+5mj#xMQa4d?W`7=;5MM|^C^1)5N<-lDG)!4M4}T5(P-hWC)juEJZdV6 zF>@vI`mZpt1~5H%XV-xKm-^e599+Q2dssL&xl3>Yg@w$&g@u2F6wp@9kP1S(Bc>_| z03cgh2>^lbwiNb#Ds~{-pugGv{qrYPi5OISEbWRfj`Ev)JVT2pkwioU*^`9jQ<7%&rw+FhfWVJqo-yvKH^YnrfIqrgExAsCYIqrTy zCQ>h~!&<1<(c&#z*i?Nu^HA4RoIHB-xkmLb_S}y3KEEym*Ib&hq>gp3YmFFMq^mX# z0orKmjqG`2aX&ke+uw=~O)}W;a-y~Daphbdp4e-&bzynzC}4TiwPp?pFxV?OIWQg? zdm!R&j?h0fc=`_o+5SO^4AVY0zJZOD)aD=FbHY-r^;8*}r^`{k$@;*V@pWBdLt_So z6@9nWc)g>a+}nr6Tx-|TWaewAr0o}m4WL2+Z`E2+Z_8X%=A$)K=BcdC1CC}vA?n10*px`+ExpX22!7 zIF56BdSmK>aIIWp%1JT3zQZ{uH@D1^M@pkM(>ZCYlte*{1(b1x0U~Jxx?^T}rYapS z?(MQOku``_lm_{fawC1;&zaq#$Rqd9j;+hh6VHyTkl$3IFlZnPM6u+fE>uvenXz4d zCcQ8Y$0<-(&s3VTaAL6+w#&n8SO9UG?N!FGmOYZrx`(4A8BG_;or*<;o3f?ECI6sT zR|nWhEHHi4+d@q=h6s^@3v3I(lR`v9U3t-Ot`p=GQ?yu1u^*zHgwr7f;}>{o%jTTGRgXX=?-M`xwes^@Eawu_tPrHqwAEk01~P+T=<*f5PNMvcXr z49A!yas_czDNK@+EUDadegM*}xZv>Ro;*;>W=(x>Z~;UX!!0RbD+Kg#$JZAOLnqd( zGPbBf*!*6QyvbV-gxmbhGjL{-67?xd67j(fNkJW+CH`XS2JBvp~i!6mQBuYQ$1UV?NR zz+^2iiW>P+OrUn6rUtbkhsoV{@>%uSm|k@P*UnTsi`8*2^|%_N7-2$fsd zv?p4oE3zNV7lZfm^F;F_(gn#WS@b?nUW8k6dT>?ta%UpHlrgh< zZIR(1enD7w2_1e~GW(z#cIVg)&)ZhvlFggP`U5gX1M;iT?9J;ch~cZ9si2>khjoeo zb&5Io&IUD0VHOLYnnkm5XxlQf2YYo7>e#tVNq0wt$)o%yaDE|1Id16g2K|bdx9AmD zWr4R9)|W{n4pp$PbA&ZgGK|IH!wA~O7g)B>>I&L#(qDeVyL17MKEdc88%S!V%SJ9p zf7K=`HF6LfKcyp;wH6(O9l<7>pb4y971!E_?pYErr1pd(Id$&O`66$(o5*QH*y5Is z9uIvNQii7R3UnCV{@!*V?~Xz+a&r4oinsxb zG#tvAVvU6*n?Q^{2?7;xLhv=J*o8$apWv&M)Sd|`&=7DpKv@NXJTT% zpDW-BUXHl?h?wWz@2TE?p#cLDU*7K76Hg%89e2G9XOy0E-IXN@%A@^5*F5w6I$ZGlOhF**ID)7i_2Q!mzz6g%W?iHpTVZ8&W)YvM_kn6V}e;H;uZAHF;O1!pe zJ)>nfJaZC9U5=GiaJYa)3#NuS!x$H&JBL7JTL4ux@J_RIg|R&!m)p1v@D0kE@_DqTf%dw?2l zV7EFx@nbBA-Ob*EHV5-*v_I+vh)pJ{Qu+>r;xMjlN!*Z1b~ZB4Z`YKjyYA~%7CYi| zuCe`AV>;t%9GwEnujQp98Qgo_$POz-N~HUT=KT1xupnO!3`lpl&oDWV_Vs{CH4^{rLo}&t1ho3h7Bn!|jloM6-0M4$CDe-Mk%8ZN^>g<+sMeccI@581O zf@Ads^I8K?uP-7H;$%)w+tX7|Co?9%z5CuS$IHwn#YM9g`RBsjQk24-ocz(};jh&F zM<)z=-fRUerEI}5X!g?j;3BfrN;xvt2loh6DU*ohVrq)270s6iW+`&DLLqTAlnJ#R zA96gFethzvON=?zFjZ#VowG+PFnE<2s;N^SvYBNB4mf;1R!0?1jo9Avp!16rsI z#ZC9;t5EoPE+zv3u#GoSDl0Q$Jcsu{stEQG`&E5t``Ux~PySx+b7}<8)W0Pv;*F$u zuje^8;)pemEJjwn(_dDNq7RSIFGNy(DAH3}_<@J^j?ez+;D?e5i_mg@vz%Ta&1VN= zW!vQh;P<4um2P^hib~pu2zbZ%i3qJKtg9IOx*<9y?1B!KO1hy4NrRNKR-9BC9uUjF zMjcU&@@#-xCAB=mR|Zv)R}=Fogcm0IdYSS)b*JJz)jG`^)=UBlcUD_Tw7H?tnlF+V zJrTbPoWYjI9HS$GmaYYHt5b|~J3U(vvMy4Mfy|GzJf@*An*EKseHkB~8XQKYY*6p4 z@kEUtvZL)II)sLVRg{FX!NGCQMpoM=F0@*@-E1_chc57Srq2wP3ypr#TLZbr01quO zE$n9&71|72q=-$W)do7kZBy$b8Rw^UTdcs$t}^>C>-YM#_xW}jg>AL=c*=F>v4i)c zK!pnU`-SvNjYA1P8)ueenPcVVypH*`ojfADhV?}}=k)p?@n>0O9penLXF6)$nwfh3 z3|UJ}-lt28=Xzmsu*~}Fw(g(qDlZ#dB-xUew0ZAoyX$|*%JWc5_ps*n7EyLga2$<( z)Erv49r@^cHa>TX5xZUr!CuIog3dXA0VE$#<$QP$E0f_4%F*I$(sd7rC_CVG`bYzg z{Hk&f_NV^Ctp_;QwYD(zk+|jFoy4*Wxh4j!Jps2VoJ){$p0ZdxMot#m?S@SMeL9o9+GmiCjY#t9bBLZ_ure!1}FU+JxA@F-8 zj4mx>>-sZ&tG=t+4~RidFK_2~&4g(>Z0BBKB%V?5tZ8jjgXy*~df|DA8oPbOAD6oh z+AIq+8$pQLNl}@!+{V*+5Edds+9l&I`S!vfL;YI}A_?4BVyNt^~aQPA_)xmIm9g=2E*09LJz z$-iY1e#BVshtNYu&JtlUkza(&#*aLC2~)hjdTX`knsCai7wEh$?x$Rn*AYJ1ycM>X%Q3wiLVUPYpI(PTDGCun~y$b4XzGDgt#4 zc9sbmQ-KC$!A$t319W-WD^%9u5E8QqdY19D=|>mBWf_VepS?w-c&zREbmoXn{j%h& zYq|nfb?NU#7s+{?vfjRLV6l)N#f|f?Y4uNNhhFfjV7K#d^JZnr`9<)qe=pP)n=FOGv0_ahqTM_;LDZa_B;$;JT+4!;yJ91@R7$H?k^-*rhaMM+(Kp_P&C*9aq$Jb0j? z6~ypHNX~?;+9hRBiW~YKMzBpMcgdI7k=uc>|7TF&qI~V99M1}2R)qHr;j?Ao_Mp+3Vfmqc2CVp@JqBy~6h|U&SlJLnkG&)yYL+(#4SxfV zT~?OcZ30E=9;;%9zaf| zed+UC82)IqUsdN@-)uSC*`&STWH8N}&AX9&)(DMeDOUfjpRQQ|>xLmlA6o z0O}p{t^O9JJ&myq;qrB**mbYLD_1y4fdjKlN`S`dxtdIOB74Z1dTYYSJfFQ>Wa{&` zl}L~DH&&VnNZx>77CVy_aF2&5xSQe*msGi5Xq=eME=w0s>w99iK3lBf`;o0~WtkH5 z7}i=tT4WJVbZtwt0Y_q6V`@68Jdvx}68HSkGZ)KTRkBRBwe`$|sGja5 z?fpiY;^b0Tajy*Kol77db}kpp1U4;U_0UsQK(Q69GT1eGPoS9G`Q{2}1|ncs&#U%SAOPlOmRi z4ogVX63Yg-dC&OdSo<bie3H<$M7aJKYt6zd(dT*2Gaj#3C<4f)kOxH6Cah;Mj zL*0zl4{gO-Epuff<+MZG1>F-o51f^Z zf+~7+%*=^f_jZzUsj1W=zXp-qXHJ_18^s0+BFAfR^j8W>0B7);}_+{O_k2UHK?bZi!X( zJAxa&nlpP-OEB86?6&q>%A|X9=3-8M605@AOy&-4j#1@G^4PtyUIUoKk~~^fc4ob% zG%3>V%(bTQxv`8r9$X0R_k3m3x)_h40lRCoLV9rBNJpiRflG?8FnQkS@Ymph@TCaJ z)BaU4tJfQXu^9WJ8u)sQ5~_NQ^!86%LrD3qjWM6tt3nhAD_`^)zXfOMIIocDTG^t1 zEC&;k7)N`|lxx0d-Vy}LwR|ZOScovHYDf5HF7!>0p)FIdzit@#I`P#k`NdJ+Ft5NG zM9#po=vPKbAjeUKsc;k?hbd`Mt$#HudVjwm>-L*~Y-QkQA&f(?s+4J{O41m_Jn~al&&+KPBG`+-)~@>&uC6QA)C*5VV0EIbpyr(5F5C^;x|^u zc@&oTO>^}d+li@x{IOPe+7%yv@)me}vp2ci<7R49QNGSQ=^n|m$Rf3aj$xh0OK|dd z(5?SDCBC9N`z;}|O>D&pjTYHvgB*>TO#f+?F+YA1nbUSpolDe?x(GJQ z0oo`e+UZ?@G*DkHOIawtY%qI;uz~+k(dq7yWLl8VCe!m9Yrs=xRzsxR(6o?;jx1O^7moXPE(XlRB?mzyHcMaqG9@R6=Cp%(5HBU+K>*6{zyAJmW%Sj zlA*G}+|R&94CY)@Na&$y|8UP4M_}@xArz(%DJ37}`3%IF-jR`X<|ULOb5%FIP{OGZ zkjB|QS5k+Ghuzc;j1u)oA=y{r1rvD1;@{W3_c;sw@*4rsLAV{?QpjMoyv>`*JGPUk z^FrX(yY^V{*3%t=8^9gtq1UL(1LyZi;+VHRlzf(_x`XEVFS?^c_Ul_=P;Mmn|H_S^ zgEVLUp*r&y4=&kXVpyrm07Ar;H$gxa6li0pj_=*c02!BqlCS?QxVM173oL;5T@2P$ z@(#3vd_n(zAO8C;0tP1kKiVQxEiwv#vG*KKW4Rb`6qLhp`CAU>@0R~jiT{f?S56u5 z6Xeee6_h&%p%zX-yU%}X92nStnBP-D%9i4wX%xVOXdj9}`OjMpg0DS<+{0oNYKQd%-w4mwH{TU$hK0Ol13O)&d-dXCu zNdb`xA^fkD4MM82HQ)$jNd#9o$0RfF&oPGN73Rge;(h zekQeN>F7I4e$BVUOi}v@*8SDNc$Iw>4g(YFb$-5K{2u4aHN{|CM;d!Xb{g%TIupAq(^Q-c0U6}oLgoS*=I2lL4l3clI{#*kYi%W~c zIRpsWj?cXPcU#&}mz5aet7FL;VpDXUTcMod<{GW|lp~l{v0pGflJcD<+-)7QNG%`D za2o*;7M9YhF=^GEI#>q?hD>v*THliPhZvaGov(lkoq-o@2t*m~Dx*R5KR6S=7kxhW z9NMOm4xEfk;GoO`c4`_KNrzJLWuRrD%{_i802SUSm+_n}Rxy!cQAmtaF|W~Ypf6e` z3}Vp;Xky)8lsoF@ls-G%iCafII9H5jcP2lMfrJt-J}PzODrOWuRx5-)@>!}WBy*h5 zNON8WdtnrCt*dj3$2IJ^iMQsQA}?a#jbr`}6`w1X;iV=5uGXWEoNYMwBw3Jzx?4?2 zxrFt-q(({CjnRucFsH>hL3lXD=D%4E6z_Kjz@)`>CPGi`W!)3uc?OR_>&!|JX1Oe7 z&*2||sk>R5wt6cKPuymVdNn=AWnghKb-@&yTZNvZeV;3j#AIz4a~yfiUA+nTEbGyb z7(;z4GY8EK?BJkV*qrjdzK3^B|IP=aHc;SYd0Qw5cN!z2nm*A`+*b@9I*=NEcQ4X3 z^J~~q#XXHb+b82wJz*n$35W;?WgGgJoB~+(XY$4mk@quQV%T01oUkK~dI3X@{V-{T zHF#CK&*hi%Yg`|G2}6o#sgvAT=OL4ICGr&e4;)i51M@oPe?Val;pPU;kFS5SQB!tB zlXevPj#qUS@wo_3hdg{qs(>@0Op#3B1zsve0()_P-b}hS>U1@LD;E~YS9Aag?+6{w z%e%nX5A4x-ueGh{}Sy2 zNnxP?|3ASi9e@_b5w0I_#mvZENeop9J)G1W(-HhTH}Q$@wnt`(RS(ep5$_Sl=axVD=%>Zw zThH6?skdJ}4n(=0kMWY=jrEUgu6slvB(zhF{}cSPzyB{t0(2)K!O<|}o85t|V{k!! znjKP9w3xdS^bZPfX;{husviW&c8pPFS;>tw#4uyvc`gF*EyUFJQITa>G$Uefk4D7! zBO1u2c3F|`oRD4t$b#XD08hO^JfF3o>753ji*Pm{q}(GLLzHWA0NpwD5& zha8M+PE>gwgNT~DBkt#Gc|jjpG4gK4osVQ|t&Q2wOvK$IVOMv%w1Thx$U;8`Vj*AC zgn<2FxwpF(KF@9bhF_m4{V4aApQHV^Q+7R`eR2Qz3#IHTJ~w=|e+_wit$+azWPR<~ zC;sr~du;(Z##~aIElr_79SB&!0;Gb$^ku`F#e^dBQfV z&Zb~vu-d8z@e7$onB2IOX1U5lBl98#ETl`&bzfy`1?^4&CmQdv)C*N0kTAoIh zK5VvWP6so=C@gK8!5P0TO?F+~BkjULV~@iC%u!3->68k`>-(&DR#qVf_oC?3Lz()R;Z!z~-;@$dMZZ2~6h z^Dt^d3|B>G)3DUM)%?I0%w;R^TSX}lNJ)&D4SGSRj&edJcgh53Q9&647M{{(E83lH zv>aizeqf%gXG#yEX-n{tX>dLjrX6AUw`$$_0=(r1d%#<<$hTU&@276RTpTU5jVQoO zlLq1L6p|o5=AZ))oj9htzRD~odC67qbK~jc#A~s-NKZ`4P*Aa8Cs(8dW$vjb1ZQfO z_l{9evBmaMgeNzMqv=l2QJnYL2QbEKQR>Q2-UXUj@4he=>M_^RHS3uyeub-)Flho+ zHEYzXyOJ{>Pob_rp>@PnrDzd~BX)eP%12{{5h1~QkR%7@6UpZ&B|NZ+x{WP}hDw~2 zvzLTU{&Fzur*->`zsRF!Ay(*StPM|_c?wG0R2&UZqUnw^9awvvTuK=~gbWn9q|phG z56Sn_U&{bmb`Q|(hh!-T`ja3bSOIuK6sTgfsUI8sg8@-8JpT9;Wv`5|be0*|r)U9H zi7VbqB(*?^aLzhJ1pGT;Th-woS}V0-RlPoFHs*{UY>HK{G`n-Jx>Z zRE#ull-81dIZlors|A#12Pe%lO&AXIND+2L$SIU`*QiX|%7%KP>Y=J2=r*VnpE6EP zhMVVou}+v6l^uoWFbn*a=1(Q*+D_C#KKQku%!VI`)fQ00T(qB;d6m=uL!)3!pBY1} zHi=n|=M5}VWa~^!sv`XDO}cGm=5z9CgwotH;#Pl`X&}9LXf+P_$6yE#DwI})eovEq z8HXvh7*F*htpampa>y;}Tii{CxEGpF7uu0pgh>OeW=2uiF1{y2hFSipM|`mt;8(9r zwu^;87tyLoH$3)8_ql_(5Hc-65bL4bmW~2uLUbdVcu)-}8QY&g1!9 zYnDq{d-lGA`@Z(I_z*`{WSlFR~y~3mHJeC`(s{Q1t=A{ z0?}ul9`0TB)drr;4!$8YX&+9~or{^QN9J_s+SIBl%vfs;HlX#ZDQBatBmVEK)k!(s zvr+Uav)nH87Fub_A*)0(*>-4$XL5K(bE#97(c|O6x;L1b>$5F+V&!re8k7_zi&WcR zWjv+gAB_6tJj>aryU*fl^m*4wxCi=7$saM;=vx1>S?~(O=7<`Z$fQdVNLt zE}z>}yWCbWUu7~(lwR~S>%)_?nVT@B7cYws~KV;PFamSZoIH*Qlm}1OoT;3eUFjRFJ-_}};B)Gqu9eW$L zxkblR?FOWM2$Z@DJc`&tNmirdMMo>@Yfa&FW+W`UNMsTo5R9|emVl9QZV)Dp?XdH9>%Jonv}}! zhoL&)ft$86D7TRr%FF%YOXFZ5mNJ`INQIDAEbq&KE!kn~`l6qNhj#hUX+zyH0_L~j zR!tHem9}5MG%7PiFXW{Thn7(fH@6abwIWsfa_N262LFIfyS2ZaHHSoR7m7x@;ly=~ z3Se`VFVz(jK|3;CV{CnrWJa1VdY?8|>=L0OaLF%Z3Ck#b#1s{>Ri+u*$6}?sswA20 zdydS9##1J0$8%9RI$J9Pk+JH`erhzp@VSg9mn_Qh(47YG%uPcy;w15 zMz^U8IowV=Hyk1|aU~|0Fufr6k8cf4JXZAZa7y;69umpHx)^qo{bU})Be1@1E9~Yn zzUF= zTrt*^YxEbk8LPeCn%;6X@nt2sf|B?+KV?d7zb4IMe88{u-TK{%U}!o~(}elWIJQqkq-Jd?Zir7sY+(HkQwDz^a<^R5gi!d^nra;eCGGxqjSR zU%a>YIL%QDiIIjS)llq~Hbi*JNXFHrA2_qs1i$bD;D!21EzRgY{eY)YQn@Hw;$OH! zL+-!wcI!KGOzaksVXnL4jj78M2r}2G7A@BH6B%=Vh9mir9(0$MliC({*(E=4cQTP- z5}DZN;|AIQqQ3RC&n^gEcrNu4KDv)#*?F`ALi=L@?xlM#1fiVJj?gvk9kDR@1RRnX z9^gL*8u4!9v4a^nenVbMf6H!psl2q=xU{2^ZNwW>`6=({lJ=l96US@UqQCp|Fi6ZrT_iwq`BrcG7e#h)Ru4XJm|RP<^h$K#dwt1Cqw}hgy=L|wKV9EI|EUS1rQX=hS_1+}EVTb$FXIoN0q`=| zVCdL@7vx?7I=Um$D)kw+KLSqI=HDVgYHjFbu-+apGrY4L)N<$31gnXHs{x+|?YBPH ze`tF(eYblh0r46|2K>aq-$s{o9Q zehy@I=dHfb40`<(SWvCsM)t>={CZ3r5F>&wE`dOIVjgOHwf6zBXMf4}{~se^U~_(MJ#n`k7WTNq@(9$X*Iz&|gN43N;PE9;wLGz$iVuDq^*D3H7|D zrKOp`|Fl@FDd(VxqnT$G#q~WA#r3eOjgwjq9I%CXR0=c0^2mTz#FC zyLY+mj7cL%F{l!YtRB6f7h6xb=VD>i8YD1wLca#yqGm^;G7kwKgqkN`SQ;zWXJAl{ zstzTLcY1`&#PqzWQzKHdNV0ZI3!h*n!bg6=`oe+LTJOyj7f0_xep!s0VUWnQr*TlJ zL3S#VBe|N^m8ZA$&P@3``8-JbHtUioThF=#fB z!%$^o7|?0RUZpW`XF)w>_;F&#&D!|{cG7LULPT}$b3g;f3Yy=tEg4FEfrBy zHgoiZK7&h|Cc7S}B{`Rb4aJsVjC&ySFmqyW#KnHCx4TL$h++D|DN0jW#2Tv^=C_*_ z#5~QoRcn}LgJW4b`3e_ZU80hvo}o|0vb2P8ez22@p+WP5s3r7t`(Y~nLihvq+}DUz z#se(@uQ7{RLe1a5siug$^)-+{tY@y$i7KJ z2ZCx%TNlE6#Yu1I{objcNizuBhz=tS4bN2U$`$k&Dsz%bKl0Y(J(WJ#c>lREB01(& z%BY4mU7NvpMZ_aJb68%J15&WLejgQErILGXe`EPrK9PQA9>sCkDf=3v5bL;cak79W z7Ey421jQ`iwau{~p@8d5LPGyHLij#w#3^VwAZD_^^=;)O^i+n>WJ{OOWHbI=*ePFk zKDL;DZ3OVhGsJ?zBG>es9UpYwNQhb(sUx~?F*RP0BG9hq+2GEQ?FAM*e?mrU>Ys$I z$*pr7TV|)MG@8Quu!;lWaNaiAd(GG*p0B2gJx5os6hwZUsX%gO)XqLJBaME6mP9kQ^`@X`H7s=-D zq&Y0^E%U72ON|Z6XB&Cfj_+3LVBVN~VD!ugdspx_s0>;J{o!yA54A(STi%6ZK!zoc z^)L|C3{)e&KNP-78+!i0n^Gdezt^T;YfvfbU5aFuV`8B1CcosP&+m8XT6IF3Fy$*j z4FeiYlD>E{Z;+koMPZ;7d&GzR7Kf1q&0hH8llJ@ke&laMF?RB#qAY4bWCa$4jrm`f z-(kC5PB%hd=6$RbeYj~9;==c>64$c_6!=bKA{Yj|VC>{-?8fTsF;wr18orx&bmB98 z`p#n=@f(T-lm^#7sF!*Sx$A8LySihkfjvGJsZ-!N;+TFG0T!{78wd5H_YD%V&MC9x zirB7MrW0z9Ckqgy%KACeJj1|#xrbb`O~cCl>f@PE1<-B`(-e~87fcMCOlB?3s{~AM zk|URpk6g?*g5L?B1~z549oCgUOu;KeV$@;7uv6@RNH^&~2`iCcR}MDJLTJ$mZc11p zcb>suaQ5-U+CfasF?Gbs{@nMmor0%PqBc80Z@m4wEsQtOf>OD;O>y+yl@C|A7y3m; zaoC$ZX!DSBb~0>jNi@fS8k>))Idjz}T$MpS?+F?F*=qeW8Q8P%4A@tjZ_F(C=EfVh#VU3Mm@AN$Sv-?)`O}2ov=77Edg_y* zLy59>%ufW==an>6?RgN?p>#FPs8bTGc9XDoEP_b+1uu>RNRG~dONkMglz~}Xls$AhR<<|f~1eA50x0Ocob+!6?ju+3&y9ug-^$- z3KAbPzHN_0dOfLAa8ULnIGq`(+ZU68NV9Nv%PamzJUmt>IH ztmJGT5(5=i5T`A6ndN}Q<1&zBowkX!adPlzr`s+%tu_)~H4DDa%GV|@Bu~n`phXP_ z0=T}zT!m57`{#|ftirix*2$p0cR}k50qZON6K#7h{U_UO+Bi4@TAWaV4!$KIHoBIR z@zl=;r?_Q8W5=xmG>7rHYf|0PVk@l-X}0xIUbfCgcs(-N>xI{?1%GryEEEvl=vBs8 zi8aujtX6UCb>d%{aPV1lW!Uzq|I+cSRc^S8e`T*%dga65t#5BM$|i9Q(hccekzo^Orfd_AetR$!L=cw_TGq28L zo!xWtFNmL_bd|SRJ)Lp)D$Z(aD{<{FGq0@nV{Po9!xDQ%KPBITao<4hRsLLggraT6 z;#O1A8Vx1N1+57;s7?;4sBvF|3{AjpioMW)lEd~K9J@q_y|3U2dLt}dDQ~PwjPN;W z7dnL{RdRpr0pJVTbB3TBf}S?RK3SGgzBPf3Mpy9LUIVmWuh zV~;_L1_MUwbMnJ>uf~5)a-D{IyT0U2xP?+)+kGo&P4O%J!WlQ?Ab#ICQ-w>HEY{M4 zcXIOaZ6VQ86&Q1tT+XYq6Kg)#_2cXX=FeX@eE-pqW|3MQw-0hEa-Aa#cj#B=TNBXm`>YFv zmzhU>|7BBO2aA44$)s0#oA zWgE5MvO{`!c4%&-`o!zyBr|fj&k{8>`-p7uGR}71H^)Mmz7hV!7d+TtPLjBQl{4b{ z7B+DPk6KiYBOqO;n+0zfa>BhvE}mx2^T!Iaa+e*aWHBm`9dHP#i9faAVpCMDa)-{m zHY{geN=Q|v!1he|gn&D5l%)1mx= zyCvo>LcjUhLt5>`#%4V}lgJ;*?R}Ilk`2@69)&2sefgqA(EPRPHMd*TP_isd2dzom z$edVUFDxVBT|UlqG1-oI<*vk@`xiQg(_vfr!jXy@T(UvIDDDXTecU1;RrGM#L8Z&$ zew{<}O|w((0rA6bls7M1q1I()ip@kQcy{RaiJy}?H;Oa`vR-LR3O|d3_5?5qy{;8_ zQjpN6ckTr+6B)fZ(PG8)dEhze?6(w_8B*VLA~s90#C!;irF@S#JL6BjoB1Mco&o=9 zLE00B+JfnHKg-sUzAAX0_D3SiDuTM-2hBwOtQ&|O>pke!^ElcGXat#w9K6q;a8G zD2I&#$4a(TM%>^RqDn;k#L}-Sb|V zadzX+BlHQ6J}+M9k6A1nyv-dm4x9X*bllA-RWz`~&iL35l`QOf>XSEV@^{`!6Vb9` zpxAPpxX5Yfbla^z#_PV!S`3b;BKQZcBJ)`nhD#v0Sn11a+4i?g!3e7N5v{&%KByg% z5-=iXq_qlP3rKK)Rx7=(PvJ1Tb%01izhAi5THIq$$fJ36=vAaJh3KqINXlOT6z2!MHU-z(fjqwyC z(j_wT;nW~%d-jL3;}&L5b3ZxgAq}jOK%z#?i`3v%1XbbqKx3y5AF)azbm>OV@fwGV zJqm`@5fPY^u=hJx^(nOyx@>6#L^V@W=%A9+;Hnt1b+*cWbFI#Z^(r7;h$hnIuy^ay z4I+_7amF2YOW|~F6r_Mhy>P2+MSw>exOTLX_(UPp@>jgs*vSVtxX^JO1zY-|q`Xtp8q%m!^ zNNtpG|A5~yg}i@edfQj_eZ0{$#;5e$5swe$t3YvjPlBkSVOUz{b_w;gZ1{LgVPswd zRhc_#mcWB%^v9MyWcY<-U_A#K4($P%7WRqhwY(6!$577+^Op*h;Tk*##)?e{4K`d| zh0mIUwI`@w%Ur%K{o=#_C0yr`JW?H*3cEw-P(q%ED?6TegjT!FXjlm9RCLv}|GWJ) zw*9p8PYOCptGGx3puQkO<7*nxu{H7?3-dM7!5JZe-> z6}hXW5c6EF5i`;E`-7BA^Bc)J7P}`ho2dLm(NwbLLkt5dG9T^rP2;`uHIYG-}zDrCQI{J6(loIXq=tGb8C^ zsCGB_FmL6jB9Eig?PT;B50%6_0Y+syoc4EU!7J(fiYs$V@%~k#$~ldMJaFndqHTe! zpXG0lcwaSHVzfnI=jPAW)G%-y(0qnCXf5z2~!0lM92{@3IEz zRZFwifwjH;jqdy7>wi@n{Ngh+#KGBjR%M{N3B&?ci3611zs>wVk4@f@)UY5aFdlSS z6<3GwXO5MRjSmrKab?w3bGo~i4z89&1tlY%^!>g9{K(b&vgt&^A}sIx92|~3Oo;jH zvd+WL)s@RG`&tr?{C@_OD7^Z<7)h_J2(|IX`ao~4ku19I(|xwev4_@kbA8KmZ?2W( zF<}mPB0??5L$Wit2D5!C<;B^4n(ixTk&)U-ZrE+II~M`WRfyo&Lc+QBwTvbwA+^+_ zum_%PXiS9KoCUp@C+LIhgXRcH-UBgN?Lg=RWkyP>oy;lA{k-H{?Ri9L^Ha(X{Z&Cd zeVpi}>XfBTRXV-Pj&z>E=tmLduM`r{54{ukGia?eJMb2gyRw{KKTqHHl8sG;_SQcu zq{+&ZpSFK#zcqz5LX@DgAIiicRw0ryCHA~-S;nGX+kj*ScvQ${Mxf_&0fP5IXM5W|7G9f=7gVW6G)t_zd9)ExB9BtI+CIUg>ZB!d>!5lF=%<$6 zi6uJVS}E1yCbO=QG3uqyF1j|t#0!}tSNRYx13Qr#IB|nqj1J+%b8bsxRwKI^uHkcI z8ml^?`0SD$+a*~-o10adtQ=b?G;xl(fs2+VuX1xjRRU`BwYX( zFCIm&c0H1eqb?rP;wK|K4Cpj-&1ed0%!9-EvK}G3;`1TomIC>q2lPV3%q1uJAqiTB zBj|VnI~vgj2z(zaUc`v{YW6wdQEcPjz1oVG*#2l#g>Y?LO@KsfTw3}-ai0Gf!W9Qb zR&P2UIeT#bRsKh!`s(N>*=%`YJ*l_>!`Z&ox5FVtN{K#Mddpc$|+5MG{7^@gtX46(@q7J{0p}TE79g63| zxUVgzNB7?o^FHFF+9(G(o(Q%O}L_W9@3LW0Oe$R}u9ByE=zavzOU9;Tw0vr6;~ux<>RZxBpnu z1EV$9rvk&YA zeMldybPJ>rA+IYNbYyOnW)d|k!_ux9cqm%_>*01cfxQzMrTJF=eOdc6T4-s~a3{_-?laju4(1mG8 zDY7wXqRu<#78h280E`riU_qXWWLKj26^i4UCYKTnaojD)VSp8HkIjEfJQuOibEqRR z6h*F)X5qEQ>jS8;wrdEE=gSPz9_QR=AdhhtW~j8}92!46dB2gf_c)KEhY;m_>gfG? zYwh`Mb2ev;U1en5k8KLa?$5rd!WOO{WVH1_$Jxr`jp{pnIjPTr5!FyTu% znI{y{p(V8Wi*=~*sBv-~`myz`nABn)koRY&Ys&%pfuhC$;EejDmU|aKkniHR?8`rH z8=xm5&^=NC{2I7t^H6$SvHqUEok;-6?D0ELiYwG=={%@PxE=G}ct=K6^o28{64 z-%?-yiK6}w6avG6P-@5nK(j?zw!SZL7q9;Yqka#){U?fgry1^I4=%ZjpHfTYx_bfU z(*7mVeAl$}f6yB;3=l+viBgf_!hUvw(BLUfVE(&XohS`cUIMt)U4IKV{%*h@@CMdH zMTQDza|07V07JAxdLelK4~zp8Ho)=~!IJRY0Pyi$zH}3?UgR&<|H2Y*085zN zEs=1yUnBSb6ZidtR)2+?;UU3b?z<6g`Y1Os0wa|98*cgU@+8s#JxmG1!NzyE$`~t1 z&=45h%-;aqf0<(d^B}`U6TuIm20A1Qct0?R?ZOBh>uA`yiWIkKgZc`bLP#hFQ8DTJ zVE2%vl9Q8olZVlGe0lq^qsiQ65=h$%unr$ z`wVYEtCbmy;FO{{dOF?+soWc>t)kx>o>Z-#n5=pNiXsZ$1&y%#wjZ$_YEPlwv!TkX z{#aa8Sxa)Zn=aV~dmwB`19i&CmbLD82bbiClrCpJHa1C_VL`}OpW*M~3YJhkE(qe@ zv=sF4oNtPQ3|*vdvhOp!pc%2wX>w*etYNyIlN=h)9(?9K@43~o`E18G_dVM{TxmHy z*`)uP>`i+Tv)}>W0Lu_8cD8e!l=NI(g;-;PEWad|$WAQvRPF)3AJkrWM$4W=JD@=0 zRb@urb*}msS$p?#bAF|n=ms0wn5Cqp%I_uQ9DXHuulOKqQL_|p6dMt2e%K6(86%(< zbtU)aPl0$dS|n_YQfK#ZMT66?Hx<3dNw^h3*8P%~LdJ2uqu1$i+TYWi_qGT$b>f-? zxMiQdJD6-RI!DDZi6;%*z=)|Na0FL^)PorgNNAPV$79HA z;PSKE2PRQ^O}1Sd&#FY97;SoM5o6Z3q_fH*{JM(t&lRBzCpT2VW0vBmnx>yNoe_d< zFfxM>3LmDpAWVwBa}VC;>prGx?V2Dj>CC;1Y3H-qCwg`XrDrBdhO-@?4EJZXsgoUS zp?{-+OD`59EL|*oQ51AP3EHX4-IT;Vy4qA&9{2xoFhC~TN$oZ6KHaJ3ci2w^!*1Vu zZRB4N|HcZTFm%1JBveWCr;&*fLSSlkO?%cYONl}V=L(UC#mN&bWjzy1%g3TTJRqWo zl8-e9a}Nv$pxoz=!}rs!33I+0?o!TexryDjUw!aHyYIQd5LJIGXp(^Li!kz`{sa6O zcRhxCd@0_z@nwV{yKdyQ{-imjtFV_}0&3|lpIWFT5yy0D6l*OQrwRHwsb z8L9Q?91hH~a-n{OjXkv!)~8~7mG+fUI!{OEQ^YKh+@NS0#>}@2{#50i$F*udf_8s& zi=eJa+8&(!5K)UvEt`%x%D#CXk>0JTUJNDJ+}toh-NMa|8|a(ZSkFiIMDCF;y03(t zxP^E~gJzl$7?+1s7=Zq2Cq+OKHHB9!&g3LD@ID7k^qJVAM=B|0*{d&X(hwqb~;}_2|78{>{H1v{WxYs0YFUQ%W_Nv)RxaYSpvDsh6PM1i}rNdo5chY1Rv7MYU*uIyV z`NH1hvi30Awv6s(@4dWMHTSoJp38P(F)9D->2Ie{iqVoUNU5T{n)|PhG)=b3dL^>I zY_7lKCS8;I=x*anFyf3O)w{pf$1Yq1J5CJkqk0#8)@*5G4MgS-jrT6nVL0 zLDsQAyxK4jt4447f@Q5>9n|8T@q_EjjLH$gB6xZN zZ!1ZQgXcMiJJL_`FLiB$_29V#i7SlIkXIf1nCs@cLo7El>dGI4-dtbw_uRjum1f4- z#SW2y_QcD-WlQ}F-Xnso!N9e^MJt+)L3aoGrv3){?wArdz?8hXyVeOs*y##@Ykl=M zlH?EIV&?zgS5_7#eDdW#+zML&1UnxPJNTQ}e{OV2_<9}~_byYeUjIco5&%Db&y@Q^ z+kZg>KzD&*67&E}(kTENq67GaRk=n%AArEpr2h^||HE7Tf|&ooYiO_uVgTII)PXtf za<%&0q^#Hgz$go#l7B_V|4>SuAWRqq15j*L-2^_r1Dl3ya>ZW&S&rX;>hFX2590^J zWCR$y+ct3G9mEY)lE4TCAa2@ki~76dFO&!e@)}p}lEa!lJ6)FlAIV{VNZgfa!GQWw zZ20a7cpM2R?~Ma}BOd@1<^TKe?#g=^U_g}?GHi{J483Ind;ta&a?BlPp8+Tu={HjG zkA3$~Ei4mI(<`!8y*rt#?yNC=*xQ0!-!N zZ+8B!?GAn?rGn`1>X&)odf&i@2*3!lLq72C1JF0`H|YDDz1INT9qB$7PZ!dMf!iU{{W6q6!w5qvLei=kxi^3XrBC z;xiBZd3OEkp4hMj-aspfB(4Y6n{AH+wwFVw-HB_W2gSvDXf!y($zVJ^A!rZBTf{W3 zakHwhQ_fg91RK_lHTMTKdsX^l{A4x)Pp6JF<{XQ%R0d{W6?3PhcR8hNTdus6C^B_g zYM-&sKsd<7cuOJe)G}s;%=TG$*Szu(yfHn{%MvubkrFfeP+7N%5%UdZM67$d)2_iJ|J&jAZoQo`+ZyZr zxq`L24=V;}!g!TToF2>uFgu_74DBgL^FNhZXG!K}#+aVs`fIJ|q*-lI{1or$=Hjc& zY*upEN%Mvwmza01^o10XELZxivb@Y%<$BX@G55)uQ0THry_!#1Ad3k~ZK?Z3zwjMZ zA0^UqRdR<2I~>%uA@Trv-TWP$Fi$1;jN#BaZ1WT9IoiaJ>a5FjO*g(rxP)Z__6F#U zqk-ASQvI5@45Clxj;d$h?`qB@MyKUuBMeXF1lC@%$s}SFj zWa@r6h#!mRmTB_C4D|=-fv#)%%O4^)a_XEDM3tYvR|$>W|7_Ij4}GcXZtbci7(Zwt zHHdSqw$(#jm$0G4j(j3^#2C^9w{@Wj(L-46lc{;q^l%H&5W%n(Js`7txW0?~vu4{C zg2_b?TnJfE_F+)UNbg#qGLAQv)a%wd*!z)y#WEBY(Q>T=O3Wi_*EsU*Nt(pHC&RHr z(9kc)HV<+wf&%wtHlX3E=C6_bdp%jS&R)~KQxV<8YTX=;!Fn(!Id;*|os&zY3(!DB@l2^LyM7r~>66Uy+My+{j%~>Ff&% z>A}>yMLbOT;P7(wEZj&sqecErEz=H(_JN4;#Mi+!%K3+Z#ih_uXJjVWL6ymw9#C!Z z!E0crELN_4@yqFyO1pBQXT`#Uz|*)}@e2A~T9Kv~d1#8H5wFG;P~ ziW@lD%l{H<0KWRa4Tr#zHa6~7HfEkymarr`2tHKjN(V;=_XoKWf}7Tp)u5L7>c+HS8Vu3)yt@1JW;}_ z0!3Ou2g0*HENqLhoz!IB$3jB~vv1H2(Af#0W2W}>TG(dNNrf@FXnd;NTIf@R1K;bi z)KrRgOYojQ&W)cD|51mZw4KsW^QHU3CXK6-p6C$8oXaSBGy zEqCtnMEh3S?35W;YE+Ws?75LlpA?$0=ys`|pqeG#6m~>1W##t*^+H0z_Nw7I={GS6 z(5Qqbj7+>(PJzKxi%ktl&lPi64k^^FKWMGgWzWfKp1JWoHY?aEWQnMvCw!kJJMLvt zNl)F*Z6g~Q$E`)8&&)l}`3|?6)+8y^O$ZB8;(^Od&|$B=Qx_^77!SAeEj ztn*yI*%3KcXgs_QrGd)Y#?wm=br?M-9V)x@fLW7t)CHvgbtWd3E z-AuzxI_`p@1AfZNBjsW*Z(K~Kg4wo)>(u<=Pz$ggb95AUQE`;_>>$3{dp(J~jP%M% z9v|!TwC64O?-M#atv(d`ozfu^I^V)%bgwR^0vlZ`Tiai~@MafQe2OLGN*J)Mub99% zz+C(JFlYAilviOfl%BoY+?J!qFbR6X*PY~wmY{&T-6|da9i5{)&Gnvu;Gqw8_lPn_ zV4^ETTycL;86+A|MPSoPnDXuw{x)`C|0J6K10Gs4Odjlre0jnC+XUC244k86o*u}n zr1Q9ut(DH~j}3Qd1w_W~M|6G*-^}n&s}eDt*E`ltuo=-GYaLgjU3i8EI)XvpG@t)G zB7nZhXT)w3cE?k)IMvLNh2s*Lx3UL@#gN-y4m2|Ih&?-Y+*P3A-d-sz`M^Fdmd0GZ zi`&lHkTA(@>$}HY+4d5lta>Fagx@dyxCF9c7W5wP=3SvN&&5O@@zZky5?i~~@pLt} zNMStG#PcbRMdVpdas4t1d6ohwo@B3Mvzd6`iMEJvD}S@_RJh`I*aXG644B-b>f=ML zTnKAHO!wUR#k+-$s4TkK2m}1h!p~VU@|v^8N=IJS*WT&zuR3h9r(U<1Kdh8Pap1Ib zQVBI^BA$|{p`cobeHChsI}ejFBT-*e!S%)r&yis~*Tvl*Y-S{-C#!i1#j!PfysEWv z*&ry;H;{Gq&c4B|rcd%*&o&d}mHE7vM7JMVWKm43F%LvvJjcp8?D7BwwTG-Ag|aCPyHZ}CBA(Knn>^{Ms4*-U-R2I^2)IfXF?OTN}edO8<&3eusT`Y8XHlT0*zxSt_4rQQ`I*OLiFwVED< zz-TNO2ee5lNCesI9fj%&qBJN8Wf&`CP_ys!Mu(YVs8Ak`9f+X~foviLC(5FEqKFt? z=4=USG0g|(KCTG&$gQ}x&$xKR z(>~!vzut!j4|{Lod@9yPJD7Angc|Q$|LVBC*gtz5!F%U6lK*>P;STK6z}NX8 zrg!e0%j%~yIl!;j`x_nqtBr;l8W{xsTo_`CerKadnSeUrU4Ht_`T5h^y7OWr>_HD; zzk2gP*#JY?&|^eI4H5?iW~7f2Rv!+)4}sr$DE(&XuNg@X=kCQdR8m@Nk|6{i*u^t;E7m|@s^5P%){_}eb| z&BFgl_y7im2b<&o9!fHIg=pW!HN>B6mudlPJr7LGznc4tT>xa+;DjEK);o5A^AyI@ z0&EjqU_3fH0Ac}y3>g+%jRGzu^Mc%|C0x|xzXar6{w9C77H~Bm2=bl8vfi_z zyS`l|f0OvtA?DpNDGEIE86@~F9#WB~lj;t*yjaA4G4vOB1iHLDgh`x}LSSqBWGHaw za7gFfNEKyio7w@rjepbopOI3-p^*^1yX|QcutTW>h{vo@b0F>_mve>YkS&6YkH*T)TQx62B)lptURTr*fE6*K4TW9TFd&Sp*SJQJJviK7 ze9z3^ydVpP8J3am=*cXgOV{dbUQdfyM;&PsX(W)Te&-J8$DAbaCd8&w9OBeY>9#%p zx=iicw@h9gyO282MMf_F7Ucz(+aRaT@^<9PW$Su9NyVH`J08;`IOzjs-$Bmz;I^~$ zv3T=+L?UjsIp{-D^(5hu!MqjWxnU7=8HPfHvF`2i+;b5xEblZ2N}D{>E%MLVtq*1f zxwW4x`u1{O`#;C2{NBvxL~b752YivA%|kyMxvoZ(uEt3Mi)!wmzN+utsEXvr7t#q- z{w46$H5`@KbvLSZ=v6$aKiEG!>=678Q6+b;t$ndFMgaA8AfS{K$za!B>vU|&+QF8( z3UMc9b}gRl+FzNHC=n;sWnythD*HDE1^x7Ok+mEPBBxPZqVk^f@ASkwCNqVIMDkoxE5n zO3n>^jIXS{SUl?iT{E-8CU}!BCW~G?9@NlA^`5lg3#Rh4X!tA(qK>+_3*#BCXk1eJ zM0zjUQir-_Yz1|?^3*YHLUAdNIPlvKFhqX!c@n@O68hUA^2de+DnQ9$lSvQ^xJxRe z=k9l;gmhTB4A|oVza8O!hymM_74Dh=xqnAR>DEpXo&diYB>%4H?kuMGr3VJ*1rEvH zEJzU|AWH8D{>8pN`gdjjTNDpQ!AFJ+ozsQ*rYt-Q6xaLmQ|X5jY3Mx?1a7XybSE?n z!8j_~;mrb5M;wbfDv2=Gx)4?(1^PsYlZRe|mqR-1QG1gz4l$)uGBT-SN@7@(-GTe^ ze2Kw(tB>>J?|BWfji$ZzQX0PA^w5q!Hs<_z_Gt-mQb=y^XZLX@kSex(I^Oeq7y9fT zx_cLdzF5(Q&_BXI^)}Q*;v#cVBgM6P*EpSyx%~b*+I{m78>A zuRQ;GZwI}$jT3$H@Ee5hXEE^)#S!@IjT1o$&~WXFjPIry0u2@54bX9dPL5JQE4P&i zeqcb4`@fz(RKfUJ_Ti@l)%Sd8%0R;GBn8VZ)O`#8MtVfm$QL3$bK3I$#)jbslDJN# ziQp;5kEhi?l(Bwv#Q%JETBH9%W2DyeMt=m#EPq_S*^`>vGj-Apq1b>6PaGl`4bt(C z&J0b=4E4>>nV@H}3#&(I62RDz!q||L6sf}Hv8Kjxm1DfxqVyFM$X(N+TP26BOQ4=7 z9-H`XAGwW2bPTzrtPeFRcDaqL?YNi2k2*nZx+y{ksAwj%*s;xFx2L|G?2PZ5eC2eO z+gmQ*I*H8t)L_lRBML5(OsU=Sx+f_P&`~Tdf^A(mdrc7Q_kSQ>IAn{=c8U=uT>GHF zn6S{dWe8Vnom}jkn*kn$%7mIYDnbCs;#7^7y7kke$$i4f*NsgQO+Bwz_YxY1%yq3d z7b(D(B}FP=IeHo^yy3#odWpI=xPYt(s-nKj$?@4jMa!kQEAQI5gAifVOx{lKfS?elW|Z@I zqR*(q_izj`dSk2)YBXNKkV6-?pq-T8!$FGi`7$!wq66hRG-_og(CEXqgsxdCJ;i{&YC0uFY`Xt6 zyPZ!bcZw$TmMlhMAQUbCUC=ahZj}CmkZ_#!!dhXNgh4=QgYhLSEi|7Ky(9KQ*GiMw z`N$>qJ9SgA2(03X>kiSfwry?v@b}y8nw9!V3UaOB>Y|4EDFVdjeZ9Ho#m=KtH$K?7 z%s0HyL&DN$6;Q9zOJ*K^j#}aMYhkz{o0!X5JvU$ZS;N?LQ^m`#nL5RvB~8dt86Xe= zt@#69rK!V2#d6INk=4g^!@XFfe2Klv_JnwEMmtAcTWN@6XhZ7HWs((lc`^yV#jLZ+gf~qn??h zL9)im631J56XRkU{M04%1 zy{LoVz{RFLWUgNFVyiyqGDiTD!Gt8mJpxP*jYwaYbi-!t${X`on^;cvQ_lG*v~8j` zv?Qd{rv2I2A_O_u%l2)!cBjYnGU2VRQ2f&Udc5<8Xb;i?y@ZzQqKQeZvnoh)rWS3U zSGBnhf2AdFW&u|Cd4DP--N4^R=dEzSYNI*hBqrSHG zve~Gsu=>TfJ!Q`{JNGSCQ!Bllhv#|=`lC<_@s~>XS(G)==^t-?PZxVyhizntBc-z! zzdM0XF*;Ud5S=J&np7nJ?2_8+eb~B(aT)hZ#e{>W7TS)wpkpcX!X4;$Los8XMyc3u z0}8@QQgQ*5q+6oeJE-I7hc6Re-fXN%LIrcvWHemisPnfR#`=5TUm4-aI@oKO4aU|$ zvz5cIW>0th;-27!I^pFAL|_MtiFL3%o&w{j$Y864gG#AErCT>KAx!fBak5ZTnAqhx#udC{I}Ji{C}HY4|$sDpHN{=zvpJ4VknsJepyZ0UmgJ ziabE5e=~XLgU1&GxDW0#uXX87rbT~6(!$r`Mgj=c3Jlt}w4MmsDcNN?&IR6nP=|=k zFY_3My#@kk0|xdKvia~?u2||?5h$T%r?V5`kYeK_&BnAQ)VlcndCgM(_vMH@<`8W&7NME}WXEmTQHe}V<4FnIbWV%B&wJ`syBD6Nzy1M# zrg^oixSA$Qs9JNl%%D=SuW?9#$F^;&W83N2wpFoH>8NAdHafO#+ji1#`Z@R9d!GLo?-@15 z{g=C-iKPU^bE>u8XY8Odjx?dIe}G6|Xa$ z2v|WgTK{%H;LjceF_>@^Uu<1VgB&Wkqd;2lK%|nwIv+8xdNgF^e8AQ!b$)UHD+L>( z-~=AJ4vf575A|s2o0un>GtMm`gKHA@;R)w1Sm}YA7gN|YcV8ECaEFQ%t8T8D(lPgf zs@$>9^F^h1%UM0LnUmaF2%TaKkWRa~1Tgl*8%_at*n*vhkyzXC`UiUNL`{51U=L@k z)1!?z*~q+O;vAQe%JUN<5)vY4sR)LDIX)*R>==?2634fP>q*0kRhKt=f{!YzIk3c4 znvcj&q*{0uaka`Bh{mK4+(@%E&7K?Da*7G)j#HW&<*!Ao9(g-mbKwr;rB@7j0@AKQ z#r!iI6htPo1UKz+^*CnR)Z-2D@;ahxW+#%52k4drxuoLaTqtY@b(+B*9pB(C3isrd z9y$_y5j&#<2B6=dGyC7&K>!gfZ!gIFG3wV4?GuoDX-~wyK=Hn4aTD}TQq`wg+CHON zRQappkNhWlZLRBsyRD$Jtw=KrfLH;6{HUzEm~B5*3(Dkh(N#NdXw`6}yP|G4$DV9@ z&HlDY8f?{y9zyd+*p6JH=ktuNyjjX@k=ym1lic6}U59@0&#s z&O0mJYdBzf9b;@+Tctmne{CVE%8|zLzQvA&_pPSyxfAtU%_`BLZPkzR0eHO{#%0Ua zMz8eDXa;=ho8g;=AI%H+^7&~=>Qx15(sN9+h^qpzRWyqf5o27i*?uG>yv41B$~*1% zl{q5X;N~Gzjjp#x22wKCO}A0flyXIu5M~OXgoQwEgvN)L7)H0y>IXPhNYmLda7Joj zMzChIsmvgMywNH=gB-xr0eyGmevWdJeqvl%j!=EpG;OfPF9peo@^nF zBjt+JTqaP4ULaXj@XiIr0)7!Z=PLdc6#2F!0?J1$UjJ-~6f zltq{MdkjFN61fOTlBPI-vwKVNK)HF@t zM=&$(+xPPi^lETcZPB3IM4Zm67VWrPmSe*CBIP#8%hrEY+Z(lN=LML^;zCf-NZh%XSMdciqFYo%}y)o?CuY{bj zAukSLORVvheUS2T)E1X^2_@~vuBQQqRrd(xrHOOAqB8=$cRN4tYK%jVzQ5D*Db9|~(vfV_6gtdHvGr5!wnmH`ehJRJ zaf}}DK?V%Qb=IbpQsvDj_@GbJrrRnMY8Ak7UooYP>urRI%^xVj1ENhX!0ZFeU`H5T-p}q>mZ!CI&7KnRZf8 zI0f0vwTuNXk7Z2^^Ztx)p-g+e?=s?~s!KoP$;ZWnqr4D6^eL2Ch z4a|!1LOr$ikl$S>llp`67c;5wvTEo01nB$8{wFZ`Kf#YrQPDrzraD;8q%gKmRg_&7 zEY@FmuULRD4C504`IIvM5AgMWmVRQ3{|{~%se=Xnl|&JEJl?o{eyQKT_8R`9?9)sP zKS`b)kGQF_1=is&x;(GR4&6BMo1;4zQIEo%n;kw9Bl3xo3_^RascXq5gw3~{_`f3uN?{+f)f{OCwVoKqa|Q*h}bQImXw zvgK6dM8;Ea$1Z^z2?xH24R{2Rv$gFB2U=jcj5GEYldy?AkQLCBLZs_5kg8b{rZkws zB(z#Qs=P{olRF&Q$W_tV7+;%YOpdN|eA0OZI4F&mk6xXwky0uVw+q6f=%oft0OK_< zm#63fp;Kpy9aF$9>I7r%anUc%6Fhq9pOD*7FOrKL^*Vr*sXqrNk{mjr$=LA|-%VMame z%@0}qg7Mu1RN?en7q961=m*-z^IqiAX$xpb8tdlBE=G0o>Z-=bByVcftOl_S{>2V< z2F5J`L!O}5+{k|kD3?<+P7XdnIk*1{$|3*F3;B&|ieR6k!{)`m;pj zUkLYqRQzQ-nvzCfSN>K!0`)pOJ}XrJw+jDNM2z??u&+t@?BFm-mmGMIfC9Buwb}2e zd^z7x2;RO3jO-6P7fa3> z!XWAtd6{PUJfx>c-n>pu>V2t(g1}lZacAfa0gq*NAx)M=lN-WPgzFg@Ibo`axU))R zj;1f*LlGUE(e#iE(3bZ630PMl3{h1L2|g4;6Qib6hD90Fx|y%1_K#|Xh)*O-Mj$(L zWKdm~v6Gq#E%ovYwmlBXSw+4h)-@>5(PEk`2ESf06wC5WH~+R3TR_u!dW}TjUcl^ z_b$_Jiz|*fk{Yy{$-D=GM|hB%j7*{T^WjQBsL_F4xUj}VIjtEbGFet&_ciLgxcX(@ zZ_zn&ci*P6W@}1oAA-#T5N2UpYLqMjjyiZnmaF|Y=Owq0VOI!ZwpnSzu2L*#6~Mt+Om|5eoY_fSmaTl0`Sl&{cLJSYVOzMmkz zU4%Pq$kaMx>#5&r*rodw)XsFs^JlnVn|&2<5J})>3%W0!vHz4e1U1GY`M}|;>1jJx z-z|PQp{^fAdXwK~5yq}O4}j2@d?4#K8L3?cjDf@*OS9XH$h$pAomZ~M3Mt8btS8OW z7vZ`V^0#O^=;akaB&xgzJI2F3tOhdWQ7{;?=HmC?vneZ5eu?JuK~wpcR`fp}&wn^w zKrRA&k`^T#Y}5KA>_59@M`$dUe|O91|Fx_AAGILtpDO2)d00GviaM6>gzx%$GY&gZ znvhUh@J%eO|92}4DRXmvD0uj6(x0F=4s~92UIuk->m9KEGryFImCE{m5qG15_U}Nt z4i!T~46a}SINx_;fV%|up?P_`M@Lc0gMuM1>1}P2641Sf6vHi-9-oUik6f3FT+dGr z_gNtB;G5TmATOu@k@YYSgTRY!?>jFfaUp~d+y~F$Rf>{)+^_8tM06flT)Z@)<+zTH zj6Op~zdvPYUptCLvTz{xAAjOzI_*}!@m~(W-n`~wusHNZC!ylH?3#RWs;Ah+-iYuEn{Ayp)|=ZRzkkQ$@$aT+mz5k z(`J#3VU=|2lD*-m6JBdzM#wz~sZI^T^Mu@4w1l>R0%sLwvk0bib%sirfHjSL@8#zG zopsrBYVOA^;9XY7tKnVCXoEE_T1RZcI&SdB%-KgzT4>QwDMH+?;1ldpmB%b0p3TV6 z-~dm5M{evov!H`s$~(yJ@-afM#-h5AI+XSAQppBonZ@EW$=|8aTnkR;6}ir2ypGo7j-&p;6wTP1aq zUq741DAU1{CwiZopv7rGCG0&z;@QZ8HtR7~%A>rcUzqUqwkX}$#UOJ|>3Trc#|yfw zq(!nD8lsB&Db>&ITwi5UqMQq&3fjFj+Fgp}R`W#aZ4+gy(!5;zaxp4@?Csw1;517c zC-M>p5VBSlm)$lF6dDjYDePZZ)&#^jJEC!p@#SsZKt`{r(OL9qFloj=)ZrbUiM)|L zEO?rR9vNL=!rl8BH<8ay`z#<(H$$Sf)TOr>U&w6ip35E9DR%V!tf@#>`Ym0+qB^&I z3VKV9yP6_%;y||?7kx+;bo~XEwz=*+=<5v^fMu>Iv|fQcgGI*ZH$Jmc;oK8E8f;CN zWbTejy2`aISGzxlsV}fNR)3SdSZ!1B5)hBt)i5by-Ek>G_aHffDBZ*; zwUFUHe^%#MWi5aW`UDK+@R+@>7U5QmnS2+iK8{4CIP2#GohL1Z(zQ)HU8tMJQd#*i zfQww%T$0jsFIS7ba8M{8D>A$8 zc>Kdz4KW3puMdbbGR#<8D_7j?7fHR*Pv(F1-ehk2hqZ^<#d8MdPFpTgUV@?hw^RQ8eyy~ma(gLni;q~L z#AHdE856a`I_=um8(ZrRuy|V0g*M&}%e`{;)OeeE!qL`RtC}U${QeCRbsen`yi`!> z3)h6nnh1*}l_2k`{rg8P*R*5MNE4k$4?z!*dz|I)D683ruqPN*l)V1l{&)&^n>Ax3bHlfDN4)@XzF zz{JT9xA+D=fkeMjlWc^Rj=R|FU$iZVu_=zj1e-RcU!f^g4K58588-lqE%{2spI0s0 z&D>oAHu~IJCw&T(nlSyg_WK+O5X!exFRq=57QweuBi;_5XD{k4sP{BzuPbB%b~r-0 z*0G&^`Gmp{ZBq`UU}F5?_^e_53Ry^&Kj;0${tgs~UN zA+AVLm&N1&fn-c}k+#%N~~&KQnEC#Cxak%Ti(Nr+ySM^QXCu-Le%6=9+JgC zA)ZjCCQ4Q>ZS%us@&U3V0B*o1_VKjj93f4mzO zni{adXY66LsL(mG`Rz_(kRj##&lfcIJD|ogq4FvFg8iAP+Fe&LolI4Q!u05xdx%F{ zv_)fJN_#w4UF33I+Vkuno?^Lh6wix?K|dGv(r6a$L$?UBIHO+@Aa=lN?0VK6{nCD) zud;pe52zSp*ePdNj6D>=E+c>U?Gv4DA3^ge17`%_s^AZmZa3iRr|VUYUbK3DueVyT zhbTkusUewMgjze%!nSM;l3loNIyzT6QmBV;X7}n2ZdDa*Gof#oTfgdExT3fE8|o&; z?>@x7Dtpm4?8`_2z;@{qj#yvOQ>?0xx`JGK+cjmUAG76V^dM=lOV9V91Ol3VSdH#l zr4|mqME7*w1-X(Vi3%Z8c(mrJtKfF%i!k-J7*(_8UFIxxZ{g4}$fr zo{6b&I{O6p)g$muX=7KP*OgAWTo9r;7@bz(RcvvDt8*<;5r=%4A~ezJBo~3Xt+^q6 zlm}7U-H1i;03UN9 zPX84fv>c|f_b;~*7It;k?sPr^W{d*0cV)rwYMA@f1iGRoRwhu-sy%E@V%Jym4rugN zqYUNeIRQ{s2M(~AJtLaN6*OuxHY&qKI*KL)hmLgG0K6%U+IfHBBn4$W^O~dcB*r}M z>XY_-H$-6v?T}tylQk}gvMd=;yn&>YylU<35as*lGx?ik8ogLiuj?IIWp$K7bscNx zhHdP_OhcYjtV)N(qqZNfLZ3>22P5&Ow|GsTCF>Jz0ef<=}AN3*dGkj_a z{|d(bpK|Np6<@wk#VdkgCwn-%*LAsL3tAiLR~)I|k`Z!Lh{}Xf^?!MUes;|dYIZVwhROIl*zN0p0&H_ zAoQBI0tyZNA6Z9P-U`~b`fMN~sedi0E(8;@(p0yU7^cXtDaP*Z(#XK^$D1iBAgN7P z8Gi52jwp^GLUUWr9?H+pEzix}$_!wDpuG<2%1N>2w>;Xvc|VFXHFor5N}Vvfb7nP4 z$W<1zU@l6O$^(5ERv`wkkG|fCFq3U10}FPBsX%@Zr-VUkP$1ueTAsZWEbUoG?QNu( zoM)nsTMQVos?wWAi{9j#M&G3WDmwxtmTL@Y6v`UmLnpI?O^55WL9=8LS|yc)a2+>> z=Tp?woQkYl5t2KUxUrz)C_<|nOX~ruXi9Ik6r;)TV@5T3O-le6KmO#^7dfp2LMHsK zDUYR#fjzT0wgFxxB-N5xfJ=cE~P7rgEq@h!t=DBM_qfxR$K6tW*d@Qha%Y-U@WApvrQkY$5H$R z$8>DQ+-3X?$-h$z^IBU@Z_W{=zkejcHo>UOqC;Wg0N%f2Jdx|i@By>ubo6Yq4BIw6 z0d%ti0pi*dl=xb67?qkYnSC|92rH2~3I_796*N1y@KGaRp!npT$VHK`xC))p!PAtK z5!D@)lb_eynR9PI5!a|({E6mZ0AdWP`4q7(uquT&cO>WqOr=UeBD=1IcrLI)YR2BN z3V}DoJTc6kt%x*4%m*f z^)*aK0>(#xpi@lh>(4bGZM~I_boUlS=?&RV;4Zkwdvfz{gFJ?<*TZk8)j^8}K5)Uw z4Tsh9u-2s2i?C;;_H(efqzWexFwk?J{;dz#6VHqG<91tkRbF^_`6uo`xA01%#jo6e zB875J$vaN&FtM-)W#q5Z(pN7~N(tW?vsrlA!FQPf-OUk5wECz`Omcc~ibBjFF*8cr zSI#%`0R$|c#$w%@H}9Yy1?F7l(6b{#r}a@#$@wOEE}08BS{UXwGg4|!WZf(qY%Hqa z^DLLQo*Y*jE9}MmFyNfhATmgPP9jCef1pi|0MO85$Q2;XCTc)o2O+Gwkt`AW5fMf? zCWiz7y~mHf_Az1xCkYCUf?mFPW#^A%k(0QV9FScqb{{?>y{J18cd)kijY{zk3Qi5Z zYCaY6Kim(Vn^p5PXMo@f`#&^KnKpTM!=&`FZL~z1g`kxR+i);E41v%pRoy{n${&X5 zLcR_f=;6&MhVe2LFcUDMg?dAA>VeTS6X*|sE9s|HCiRmzbB-#cx08Ct3*Qyvx9WoH zmWQa{HWo67Z5G~va!zD#u>#v3QI$gkS3hxF?@>@!C#yBHY!7QrZrWNwUz(f_#M58I zhGdovj`@29r{i1KG3LFrS@l1lDrB7U1z7L;fBnE{iI(ugSe3qyu>-qE&;E{FcumCu z_-2-zQ<+!91*~l4OkZ{2j7_*w!44Z$RVOAsM0^VMT0dA9AO8Riz-nt!XGSo^-FS~v zOjc|M87>}kzZ&rRUfW3Bc6=UR?o-x_IC2<<--E~;0YD1$)12#(YlRnEy*>Px?$I#QWRV5u4ifVIBUW$sOb{G8UiEo!h?# z_J1D;Nq>j^CcP6_g1@@GNW_X+h);OnuU`58?+8hX9YDZHy5js);5DDa_CbCs@ZKz6 zaT-2L4*xq>_#ad2f8FS>0uMi_>i!cL_-`lcG2@M~Jrg3vt#4h`6vBkG*sLI=;FO9` zao|eDt0cD)ViYXBwBHm;w92J1Y#Oxc=^|kxDnJ{+!c?`|R_0gwEjbz@D;hpOiKTY} zcI5Fvq{dG#%X_0Ot6Ybf?-^-Dn?7gIU+PpFAn%usyM@kXs#n2y9?SvF;tP+K&69z= zYYh5TkceA?Ag|!Oq+7S3orGHkATjRM1dztAQ-PvSxj*@+M;Tf?evS+h;r&x4T=O3J5=>x~d@F z#JVDhyQQ&p(c?BPpE5!=X*drddb|5TA-p{Lu_45LNcE{v=@3K42aFFrSr!b-5gm$* zJ@Ut)DwqrfHO<)Z!h!nQIhG!bN@(mT;dH8aVw~TYjZ|%nXVm~`P=jUYp}VrCyx7o# zF8_Vm;%O%dD9J@^{bT*gP&X?w%L|oULb$K*5y~=j0mNRO6RpUnBl+B zK-3fGZBCqHd(R(@OLLb9GG*?p1U%jk{OTgg5XeSh*lo{KwU8T2xZY*n z5IV-FDM|uxpec8sTQHcp8Uv$5VYk-VIUTf6WX6ocG!;~(lu1fZO(9e(7D!Ym zTBuKxteEQn*>fYsTt{9iG9}?6ENQ9XH|{%b7#808Vcwvrnp&%PBTzg;e{IQvjMT}-tPK6~0&NI%|?fz4=m>w5M8YNTW z5$&+DX3#eyDr>hD%`}=F_wys?jIAWCUTx5jcKRCQEin#mM-30qdkUlMNVCuV0pvgx z`|%4v=Bo-OSZ5O1`rXfjgx>8#c#!)oUR7oA_f;Vf0P7Ar=<)_>cj_+Q)dniJB^wPx zU0~f>OA`t_Z`M`!7%8EVZE@aL!&fuW*{9JN6u(l`K`R#0L4&3w?;^8I24e2CQg6$^ zC+(ZISC%1-q(!Rzs&dA(%&!#tbUuZTduau53qL!vrG_;pVr;3Yj>vBjV$6vf))=!I zeEr4DId*0y(oKU_SRPGe1KxYhoJWfqE@C!iZW&cLaAKLxt*mZh*|))YnEJVUsA@jKuv<@*cwWiss9sQ6SccVFs>I^LCOy6|k2~RRuVx2e zFN$)(!_enCy|%bF3dFJgIff&V4pIgtt+{EKt>D4E4lR()2edm56J;-ouUfQSh)m^9 z%bL}$Q{ZPMHcBRrrmVs&ri71QY39Z?b2Ipwx(r5EPM%_u&te-wcP!?nEH!g4$vKmh z$U#fMOHxtGS;rfCv)=S$cE>cg|K$ZRMs3GwW64pXE;d{7Xg`rQ)@V#CcS^^;+nwy~ zLNl@m-_JH`L&`O0vLdWDEL)y5!xmvK%zR9dN*~c5x6MvMY6~Zi!a8b8> zcR0ZJo;uBrm6P8RH}0l-!H%L7p=vxlowh34;<}F>I@=gnzr-giGpmqf@*@$T&48>t z_(I7_a!5J0Bx0rAl3!wBf>QT<2X#IdT}gMDWs7!Kl2){i#G1dc+gJBF*lOB#FIDM;E9I-2yTKD-G>3u_>dr{I$H?SUZ$Ve z^2bX%PE3?exI}6OYGp`Bw<6@(bA}k}NUa4Q`pYPXxgEpFLe|L=-fv<|wDWyv9Qn!^ zGZ9=#BuG@_o+;V3p1B-Y(ZaT@WMTP9#M!C0*0w*=U#sQmbNBjmL34@$ZV7BbvsrBX zU)TJNSy2;S$`rJGOTRfykEZ;@vr6%>S1}t)D3r=M?NB*=>)sSsc^V^X1&taco)h+E zrL>rYPI6T3kA26xc?-=(us7^|h00hs0H-CHn}ss(dd9_@0d&*%0q3>Rz)o^TP^|~` zs~nzisW?k-fy8zd95HQx38N{5Zq?m8E@k^g^JAwZ`Pi5PGK%LPU}T`;YwC>xUATJ}RkPBaTf$%l^TJBTS)8Y6A`_*D^pa zrj|kpMk&bND>OcjFYNr5+;h>+tI;Q>SjQp`&w?t*a{f5`&ZSusSs^eN<9*I^hF{n9 zf~8xe4AJ#O>S}NRPFIW*J-fvN%E^&M4hWguE$+Z21_ONE-KVeUSKSQ?7RAc+b7kJN zin_F_Cb&iVDXHOKRYz+OFeoif7wy}jqDT6q=KWPmQO2pm(OuZolxI{=&?_(ZJSi4m zuY75EkA>U)SgJvzw@Bz%XjIUamv=5wf-K3SOd63t$qy$$BaAGZcM4lxaQC^IS2ea3 zY5V-TIhhSUd2yQiu2!K~a4Ya~43RP3w3J5BV>=f@x4S>R#Ud2L0on{-Yu7`o9O=1! zxUM;hg`ctp_Ul647n}7GlXdK^3i3ntC{DoxTX-DSdaI+UZ*%rsbnd}lpOe0BLn|Rf z=%Xy%00y}M{?C-S;Jq&(K%==Zx1U9*6m~3dUSADeIs+Y8%@2Rv2`@!R21Dhl39d-| zxG5P=Q7QN0LyLKgGgc|JM-2TKR>Q=&1pc0^(aFj3~)19wq=#|D__m}R&)kk!kuw9y`z94n*>!xG6gVM%5KQ}<&QnN|dSL^xOb?|^OKdRVz+Oxq@RzpOX?dOxeIePxEHaUH z^!d`j4O0JkGdhnwo~xr7L**dI0qHRk|c=;&@ve5118 z-6Lan8ENatTc~13`hfvcW*aeI=BzvFVP%FI*ZVii2Qz_0GV~9d{I(3ucdFC_p!N4y zfV|id@7KA8Cq_G}F8j6bCN_OzgR;#jLSB0S87ydBQ#J>u&rC5;V1pBxF7CXXgLQ)# z=VaOSqK78Tt+Ix~?v0t+$3k8*A!v;AlXj@RZp@T&IgP7wIUni~euN_fM0<=)kFHEV zSaEltHS&XI1gj!pM7(M~Q`yi=IWg=NfJr)5$rqd-_@ns6-Iut}N$#esuOi)I@1&Pv zs9&``S*MSJ1$te^nn|@2pta9LYy7Z~u@)9}X)^tG0W+~|bNqQZuWuhuT{lp@%EaCo zBHhh+s%N|C(!uJ?+I`ZbaX`Bm$huCUy7&Y7cY3m7vj0&1oSf|bYl#vK{J%1H{xzO_ zN&1Jl{G5Z}0HU@=cE%=-{{@USs4oL>)X_dFNv#Ym(m8F228E|8qd5md*n2G5U8^I=z?m6mlq*3-S_0T28Daw#NzN6 zYWu;Sx!fkkxE|MTGj21ys&u`NThhKDY+oYbb^)F#=?T&LY0sceegd;WoQQRzdi-&M zL!;ngESgn-9<*WIr)=$l)*G0D5F4Z+cEBwMZQvH2dzpk?{5CXJX2LcV)&_kqkFmQM zI8r-JfZHw~Qai?Fyu~HPF&MFrLOnsmRP$UvP^IREH9H~8eQNC4LCeR+Mwx6QS1yJ09WwTvF%>f60%p^>{q zIDhipfjZ|Zr(hSwM!z^Y@yO<6`;^w{TeDv`Io^tgT+&N2vYE0`wCf*#nY#*w+?1p zZD=w9LDo>zfr$N^gyYtMdam>d*k{=?@QZkRp|>Fg?p@OH_+QQ|Kvgfjw7y;h{IR7> zHY=c3W&Z`I?W)D(P*WevT5U*jxpvt}hfLsXBD3})DMu>%sEUq(WhjsnfX(JDIEZmg z2Cui^fTlNn&F!r!&Y)YiOW8S)Id|>i9T;7*oA&ezXt&FgZ*9RlYcD%k=PofAh}rC; zM#RdI(cU%VhLg#3j#-C@eN(#I_LK?!=!2)JO|j^*)D@z5SCRS*xyxS?SU%T15|jN&?J%D$%OgdN-#*_IC|T3Bu9hi$2cR-g7A zuW9So8u1#3dACUdwHdH~^(k)`%h=8|e`Vl-d7ydBUQ&|j%<_H_r({tl>7^iOiGj>B zBCp^Ytv^1<48W0-x^u+5`EmNRmoIEMy=~uaj?A9g94ps2lg-3cqJXCtDaiP>T#~?+ z!L36YA)b{r{uc@$pM9fEQC0}Qinv_glim%wymn2HCB;G8v3b>*ZZLl}qDQolCL=a2}0a5*4QMG#J<8FS~dJ&%?g%d;8&PS6imf0O-W^d!q@A zGXff+Y$AJ8Kd(6BonQxlN#zQ8k9nQ$QJloeMziq_F)kBVATQIYU+u9w{0z-g&=C2_ zv85o5o}&Rc`Z_`xv^r{N5;^t6hYQPK7}J zbH^P^cR~Zp0zX)ys>^_2nX4W75vfU{N{FXMRo@SA8)HAO<$N<`NAY4bw@9nGE?<^@ zF+YcQxOfiL9^?t1f!)gL{3od7)SM9wXD5JRDyiiywWuU{h8Wo~HzKf`3>t&V~)E^wB)@&|lSeYzYmw zg~5f5yBWdo3@SpyyrU=y4E2ky8IdqF>atR>@^wid5oUaYAj)%H6Wm9Otw`fve8@BI zmm&19^CmyZbyYUWDz0W#)NnOMyfh970%cv-R}FA1bdBT zX=7>Y0pe1jIahTt?BiQ5%T-6lEYgp@Wmi8xv|2m%`L(uGOAr?y@GkqE` ztT@?{7KBVZ-n-#+(Q+B!@|G_9t|I+Ko@Is=y6G<%t6jy5Z- z=XA+2N5%@aM{JYOs^)6(JZTg@644rE{$s?x#zhn$NW3KJ)J?gejQf~3npxTvn&KDj zpmxcnb;>-O(I|Rg5^P8YM=AOx&cM$fwXK*&6AooyZ%w3 z$Z|z98QFLwPU^*(0y8zxg-XnpWPmY!>W=SUo6Z(Vvd1S+Lu5(r@xH!1EEv^o$rW8n z{~TceIA%MLW;1F-$Id%;XfYnrg;1=d`=o=ZMC}+sgG~mipEUXuS#wotX1vzwt7(^= zRWFjD1xl1+_Hd!~ViF~*v`0(JmLs2kUoZaQI$iE~M#0Rkin*ku_+2p|-Ec>a%wo(s z&VxH~59NeDT^1b^dGo3yVzimipgFQ^Z-TxQurxqsYZuVgk-dW_BNf&ld>c>#ecO^( zbvGo3Egx3Nxaq0`e*?u`gsuVCpfs;Dx&W~QG~nP}92QHc(&Rx~MYT}x`$2Hp=PyTk z&PI(kOH}QYvEn{F*IaST{^w7{)!J_Xw%1al;IE@NuIu@)l2ZaGP{b1|#B>wZ$Z=4j z0Hs1ZRHN)9;T63-EMl%ayze7#{zoj}>^t3HLB8YcZhY;dY;GOxv&^qQ8_xJq>6&7$ z5OWP9794Q%Tz)!|3j(YZ@8RZUmHLrNIT7GdhV+p&wM7vuZWi7UBuu~LI2^`JH9z`I zHNO&y`jf+bNQVnEJ2DTL95HWz<|@Jv0r=U!&PqB);Gc^RZN?*id%uU-4Js~sL5OZe zc4`x@p26pxXG+c#4&Ac%y1EB;-}T{iHw~pter>ivj9tlL~pBwLJEWZt{ zMX0aUwe?pd-UH8^{I<>+UWH(<{R&ON+qXkuac$MVVFYtF@NM+^-dHZBR{vGK3AM?ULjxGPtEzbyW zIDdUOpDG@L;6LdW(SKHk4ZCHTwB560p=Rbsk;Jqx5yl&LdF-l4i~Wg)H2=kXOQ78*R(B!nM!c z8h?hCn;0I`-7Y#VJKkTj1U^6+BYROd2J=W!%NfhbuS_B`AwsG!7nIzisyqO9@G%Qm z?3nCWohD0$?mbrt25EtAn4LyXncI*dIw5AzZ^?f2Q@b9&{4~%cFoEZit0GWXsxmXyd)QOqwiiB8`+R$LQq$I=#D06AJUH{cV8)H~FY3Wx7DxCMNN)QZ$Q&8yKdu3KeCzcPg)=l} zimW!hiQ*p@NTl)h1!VV*bfI{Tl9oK})o`Cq>vH{^-;%2~#bY8vXRdC{G&H#wHEpsr zMFd~ zOO`6{OrD}dpZ)pbN_z7V5a#G!zgIXBgnj>S~J(0NPK9M{i7Y$LZ!KIs{j*mH| zY$CmqX>(u5Z`=Tql&wIz9aUIs?^0=n94D*b_ktxH7buuKAUZw(c>tm12^Gow2+nup zvml7FBcEX7yfep)GjmEFC-h~Npfjy}TD;NkuIv&GP2|&$PGEpM;3m$EQ%(gBh=A&D znLM){ZvGpPk8Hy=L#kBHgkC{2R|0r$lo(4r!7+M991bw+98;iUT_g8-3gRANw|#Xb zp7AVVs!%f4a%O>e^YYIz);|);^V2jV!_t!6vDGKrEERemFIhJ34ln<<9<7L$TDr4t ziWT##s=j!NZ>2H!4?naoI@AU{_%4XO(0pwM?arPmz-l-vcXbZDw4Zr=JvTw{e!J=80j<6Regg&UuL)ed zyKMN4Zz=FEC#^qnca`X$%YdWFfZ3YZ=UAZZ*zeQk^k+o8w3I({4iL9`+>MNXDvW4u z1-KiT1Qu#CJcI@l$K;*Q^nC%PyVM6}+?A#u>Vs@!lP=n$q#SO@5YN7N%16za7Sj%3 z%Cin6v!%P_g|dU=W0-ht$*y=!j4pU>DK*@-Cfv?z1Gss+u7%2j_@?PVo@67JwPD<% zU3$}YU|R|__k{sA_XG3fR80(5reSMJ`r0IMEQE)rUq5)8grhzia23!m;_Ea>bwaF( zL4|4>D^(?%uUM1Z*B|e~6r3_)TB;*c7kLbtt3sH^zI2QLNgR8Bq55HOMLBhDdu$C~ z-~6MO?;^rJ#?D7QTcT^{8fIyPufQb{G_@(y(-OW@thCrFS6nYX1|J8fSk@x3DK~0$ zj+VHsxmL4FOA0`0c?uY9$#tM&yG;;lV<@~>xET>Uu`5&PUF7&VBZXsG(iw1g?^#x6 zZrxGX{X>&Jw4RN91iBob8Y!&g$~|u%ZGN8(jh8=h63JeIJ%Rn#f})XLMbdk5rG>r# zc4;%^Ne%Wo=nZ`>3iE6}?T9`=ZZTJ4bL*@Fffz#$;(z zFy^5_TLn<_T@BzWJ8{&Q-jEK%HPmh2HM?5FJav9s1qb22F@X*+FZs-YP6V)zHF7i9LY~kd)aAq&4jx2fDHiGQ-3k_N-A9jp3cXGUsb$b zkGUFQ5ztvI<2eqiB-})Yzk$XUx@10X($RtyynAz9b~Mf5gL2b@@>}7-FG8$w0+{J8 ze-|BA>PE={RimmZOdyT2kh)k zb<4d62<&dPEs^8v))xkKN#p$NugkbyU;Tq-u{8Jj{L>W=C4l=fD__A#26MPiQ0s!y zWcdM*ZtOPe>AVq6ApP=V+w|AMO=Ngau@C#%zbGa%7SO}4j?0Fzjx`41TaCe)#kmVe zT%xYsTp)U!%T0mFc)!nz;fKM%;xt$E5kp<;l-L?(T0KdGnQyM*UsQd~;H3)n=9%f* z-pX(zaPA1Fhg`5&r5$aUB74FeH4G}zORm$zU*I)Z_(Cn1jH64<6=px$C>{Q!juU-53BHSo9 zO5Brn)*~J%FI3lxn)R;zjA0HrBldmnth+fRlm~bVev78Yq4MFRJCYK_tw;*s;|~Bx z=57>~&a0KI2*-mYjsy3xUZR{k!fM2`*@`e1daL<%JcCZyk{#h_2rZe!<_yxW2t`@9 zz9q_s0dq{T1HpO4_+fbEq(YzIs9f)cJrK)0nu(qaf3pBZrn zlKDBEjyFYcm-(akq8#KAZwEs;Yrp}}hE(q}me^bJIa&_5wIMIc_A^-&2?Asz1fkl^ zk&AS@Lv?)$IALgDVy?xBHz<>W>ePBXmgOC+=MQtOe&U`ZxZhDxvY zAxs~4rH;x3;)b>xyUABaCHnSOXX;k+>=Fac4Z% z!!ok)bq=FRTz$VzmQIY8u>B5KS*)9SAe-~N zqN24HD@C=SbvBAajo0iO#8l3gN*b|{NwiE=*^N3@GLb;D`~L|0%BVP(W$oZLI0O&w zPH=a3f;$0%y9Sxy?(XjH1b270V1eKc!NWIXpL5U6{?^%-wT2%s^;UQFTUFilR9B5f z)2Ng}0!d{`tx5o-5~VsN6u1l}m-*7{rqXOOrL4X5svRHV!k3jXCE4baNmX+`%tm}w z9*?8xyo@UGylkFw zDNTtfPFQ|v;)wN}q;utm`vId8i-J^8d5zteQeancQmIfW*MPe+o3yH#TfwE2b775W zX@PPB_GrF^QNkB=@w)iYyi4@&p45!NBMK2!QtpNyyiLoaFLR5JIi8d&OHnv9HR?{$w9amb_(O zl>^FNu^&;ewAF{n8lx4{r3nUn_18dmhYSkQ^k=5Hgp0pIfVHQ9hx;fuMjHO!{w?u( zpQo^Ih>@>huD@MiNPzzZ#RzN&1r02^><83X*$?OxshmmCR=J7MMm-{uY}10-2-Pu6 z!~RiB%YDi{80d2TPUxd>Dsno4$)?-FJx)M$EL0ZRaY4IVJ=~LaY1O9Gd zb-hm&qx-oZI_a7i&NM>UCsWNboZj5Hhb;KsW0WQvYZESzt!9cg1)4aaf~u&@){T)L zHCNH{w<5=w38Cq}8`TkKOtP&DeS9QzR_HgSMs~3q&0k?hLo<#2kB(|ye z-&SSow~;$t_+Zn@2OEbm6l%nZ7McJ9lg(2|*Ak&fHfkj?ENJ^YD|9i;E&IT&TdAg9 z!W`>8`h`z~luG$1M(RK2>Ud-x>b+H6!83~a*;u@=j>*P?kVquH8X4f0qV{q2^OV2( zISt*47F{>;LFiolP5sK^{%~nU_SxWK$y+TRucTkF0%}P@XmrnWW2S=&$9L3RnnIdC zKf))7c^S3)aF7Fk{;rPC=Sq5T0V*^55807#{yL|Fq5|+qC%m9gWX8X)*^3A?(ghe{ z<^*ej)ev^Uhk~=B`+Eb-C2L7Gt)2* z7O2+ME@v*^0geRypq;goZL&Cq-Eb)@s6D}9z{)k5lfCWQ>M(SNSz|$3>vB7WZmoc3 z+`YxljiLe>fK`SKn+4jn4K`XNu^E#|mJGhxrd@u3xY#%nwgcZ(7MnYf)g--AfaL<_ ziavlGx5gluA6Y#R>&1QK9aj|od)PUu?ZJ^x&F+e$L^11S^l|xUD}DkscTVe;>`^ zn%rhZiH;SmCdtjPjkYCe3zz)keQy5&G>KGA6 zou{fmOUjO^6ww&KR#WX2hRI%Knzc@b!;`iRUxytSCIowwS}hKw#id}?nYWARkv)7{ zyHY@+nMmU;vQ1zV6DM2~@hgrYiP(9FZTm7BsiV@(iMybMSGn0o3LIZuwLDAbfw~6? zT1ZohS(+WYWvKEEa5by28Q*OfqEIOR{B4m0Q7_!aJYD)$X92)3qMLpg zxewuF52pgm{C7sI7eeiI--Iz`shH(lKm7p3)Z6za#=M{IPx-!}jt%B)IfcLbw7uVD zhX2W4UVd^gx(f>PqkS>9D)T!D*;F>!;^tzYk#avdwCb&uc5-FtDB#4=Hz|PcW6RHv z(AMj$0lLKwgQ!ToUvmw2Ww%FzWV?{ymi zH3|o-%O;r4;L}U8Ec{>iz-E4Z6kZi-n+wdY}(L5;= z7-v@!ynA28*(5Sc0=+@4ye4-lKcU-rTULcU7$v0LIt0Ks$!zCP%Ib!{Sb8bLTZNe% z#hj~<&9~sqb==+*JPNxGs$yVw*%c)K-_?U!a&J^mN$c?k;>b7nn^dzGt>r7^5u?9I zy)V&fGj?xeFhyJ**!fW(NT$`RN5OZ#56 zMwZgvR1Ax4v063|9WP{!m7q$k&PqMLYSCC}r~0%c2bntXisxGuAf!_@zphpjC>}UX z@C}US2X;%N8JI2{eSI2nowe;D`l9m|XGsk2Nri)q`cR~83v8#1^0fI&p4!gA%t^LL zJp%E=^xHRRa9_Fhp`&KtPcUmw^EA6}-+Zq1t3n;A6dpF!C%%5WwHVw+CIb6-fRiLY zLfIET$tma%32%9KxGHoOL5JRG`8Jn%C`*It*W zHrXTe3F9wtpar-DI8(70CB!+aJM9b)Pc!^a2N@^ZZ=}Uyk@8Be$pW~!=dn3@8t;04 zdH6elJxHZNdUd&?hl!tw)UQNQFE%dAh)B}vz>9ZA&rLu z>QSUe3Z^*EH(B3HWxjQXkoMn+S-`pUi|x23PLYx>8e=_sR?0|EfU^H6&}Yn>=yIEW z#&JXBD#(YnkGsn)Y zkSQ16K)YkMi{vI=cLn?rc77V?b2=8|-448jQowAMe2#%k<=Kcy;Iac@^N1I;bwWO% zmu(SiwZcyqb^UwmyNvJ!@F0&{_x)0!mqRi2E%v}6i_>#E`(z>pagxwb^^C+)J2n-H zSC+(T{y;Q?`a2fD0=aAE`tCS7j3?URT>x=heuqZoT;}$w| z1^BnlYg?9h?b`zn@2^rbbI$EG_b;6n1GXMg0z)IM10DG+q~8}t z{W2`}tYv2dbHzs$E4Zg&v&^eXar!ZxvK2+G3cwoS+w*DR@q0nfmWJ?7X0QUIeo#CD z3-Gm&ewZJcfxDrSVw|yITX-{2anK~GDIux7fS3Qv_vhP`MKZ}PgwMFrQa~BfB9n9S z6FFaWSp6-$;$fzc68~!PRB1J`)G<6`^hT_yhK-OdWVC{hBjw7o4g^m9{-@dxrqQ_i zhEB2>lHsAtq}j@8HE0%>iWO)Gj4=X%zcyhZ&LU$xvdJWv^fFfP0>pm?MlZrAPl+=X zL^v;H9#qSj7TR$|w#)XwmjlTf@5vf{KJE-h-=DGyoET7W!@{ii2drXrJNY(s8)*(a zp!-$vgBS61r9c8o=d8f>NKfi#8VjSk^ln8J8rfns=0*z3Yu!})b;hQUtlp`Azhw)b zUL^_3yWZHs*Tl`eU96`ygh;C8(#he2hq!*(qDZvA;Cl^M6ZG-P5IKTW+Vh{x#%po@ zCVVl#(Q8|b8ZrO4UXWhffvEnonVI_k>|auL4*)JHK!^anNlgOK_i8^n#mpdkKsM_0 zANJ!9(l<#LG%%oj5Qw%(O&0LG3G@)WCJZi!Tj(EM_x?sUZH4p~S<;jU0c4WAFo^G} z0-*J^+?VJGc=T705iR}$X#Cp)V(LL{vp{@Nn^sf-#jp0a0w`tnx^2_>!~Xt_4Af`g zfAhr?0d-!S(E$8>eE=a@oAov50bl-M;7#k=fU8$?tT!wd(*v62YrB&FBG)%bOmd)B zfxiU{nk8Nnl>vbMl~D`Oe2o^w=qpIL|4hpyN{vCqOjxrT z0ZsY8z7PMSXi3Eqpr)FZk%0METEqAN*;x>+?LSTTbtCbYl6po1^j;-w*|kp~17cV7 zPp|L)yc9{6lAtah2|1BlBB!hMUOwyzzXn7k_0Qawk z1^3O^z%58jiGQ^D`J1L*y#F6fT?Ifjon-=&Ugs-uSk)Q;n(x&=$?D(Bivs*BAz)k! z&J$z)`Q^EG@Yn_#)(6r5jW`k_F>!iK;Co^r5;*l{;ezUAy5SyEj$@lI+0bETd>)#X z1!`i{#q;nVVkPTWKC4#z>|5#0b3O4QR2zGF^myO8OokVmy#VA-;jmqAyKSwyHO&I< z&8df&QM?R_dAR$=v1aZAb4T4`(WBxroVfIf7#Zd`2LoJHc8Jy2<(#Jh6LESSbg2}K z@T{4Y7XYk+3t5=S*hee#ADqpKr&wRjuqP8z2py(98Di(J@;USc>89Lr+O*?G!oF&B zB@KN?OHn=CWPxGCB*K!Z8|&Zo3~AFl-G;B6a|;M_a4+oAq&`yv4xd|KRc+D0RL#3( zge_h{gSAZe&$mgXA|rStjo|k$n40sGjK4K+v^YjxvDoQ8+SI~Qt)1*%g>=XOELa{d zy0wOlxCMntb7kB6h56w-OtaX;{|FvX5?b8Z)J0mSXFW!>NM&0;%BAU$)zdrO zq%{@`V|~p3s+<}Hl&;gK(AnLD@ZGV%`6`|oHT=C{MyKfFhT-xO5qD#sgm7~1jsk1` zVvy~Zf7sKL6!C=$E^tK*tV8qrWHVK;(7AmWYgWVY(eW|HPn(1vjw~)|ambf@1+J|D zlIy3tjAoue1FjaHSm?|LyWQE0ZDgAvqMoP}kGT5z)F}OKz>-P4(wl&?+|1%Ab1U=Z znQdoG%cc)+ZP%2QL0LQ&GWVhM2_~wl{a8uNLh7u>QdHO>pM9rqG6mz1?g>@n*~wa5sXcROl}XZk^@gK{hu>azc4}* zwHvj5N-84S1i~#~mX|M|UWqfySYETj2xn?3YR%%`h%MaV^8U&e&`^J;V_T`e3+Gq0 zg_y}l&XUKgaS$fT>ufN=PpFcIkV40$vhZFr>C3xly)EPiHCDE{yBzGitHeADi_R~D&_ z)(}XB1^MQyydo5GO2F*w9>S0b^g9~}?~{jj;OYE|%9J<*Z$hp06jUJNThNX58wZap z!yiP1lww0HRAmvgL}Z(v5eDWUx-{CR`D7syp+(JteW>dchTm8e!-XmwQIiygpFUXG zgdaF95CO?q1zd@{H3kjJz35g5R{u!YKHyUe;isBTH~u6Iii%k93nrQU90C7teFp6e3z8# zoo7Tp*bBpwszp0xEyFfK)j4ajLRqwqD=?@>V|V2Q8FC@{NA7U%AqrhLF<)<^lWo@? zoLcuK#<^_H>`oiyD%Q=Y_Dq05jZ^h!Njn`8CYsoUb_Ax~U=?Q~@lAZUvulnQd=nC5 zW9Mbf8dnJg^VZE>xvgv^yuSHZ<&Mb^oRA*!qhJU${TSztncU4T$C!)L@Y%jysJv4`PFW#rt=Ym<}Z+G>@rFFNrnyi z<|gZJ+CMm4qA>M+&@cCH+tP()V75-Wt+bsWCii@LL1q(|#-D#rJ^)S(#jfsxC{897-we@UwtPeP|TaFivA$KOLfE}uy&rGK~%+5ZOU^k0?`AJ9o z+4f6IRdP^!CpWp^#m{pXh7GWyX6zdyCY(Uy(o_qQ_3F;T(P^58A4O02tc0@}Gif;( zqw>`Dfnr9*^JT#wkolTOo()xK<=%#86ji(IdJGA@uwKV!lNgHXv@9+6iyZ+=5j;?~ zEmT7|?&qHA~eahDRXi3Cf zXi>MV>=9MIJ&NcfD+>E-y7V<-X|HF^r4oI1bkxPacz9+mKUQy5`<@?_GcZzj4rDOw zn%+b%MT~PAhu}C47~53b-Jk`+d_r}udqWtv*G`s=ER~#F6+ZVtG}}?e&#H%xNFlO} zgbi9%i)f+Dy;D-!$yGt$4rDJNGEJjxdJZ-YKfVc`|MkT|GaM7cTGls_((v31xH$BOf`j>E;1vKVG`E3;tq3 zxe)P;Kj`5nO8c@MWI*Nm`LHg3n6L{Y=b6HP!;C7P;N1VnbNR;c!K zCk%lIjFd0j_(%cH-r~kLbUsnG=Z?693-|8cKITSPxnH==Mt=Hy(6=V@aB1ZJ7;3!7 zBuCH(E%MzK{uoP)o6-DhC>3s%p0vYMcT)s9p@dXz5ODqs-H8KWeqpMe8 z-}TxfV?FofaBOBN-(LF4lGsDmDq^vGZThb1-pkOwX5&0fk*es3_e1%%81IbC(~mc@ zc^)A&qQBUGc$6kmAqDY`D=RXMV>@Y5ZF&c>0IM6)%OBgRfIpFC@BL^pjCToBOp!WR zrtcM=>gA&@vz&h+jK#i;0B7&dp6Ul)rtY(z7(=vP0+H=LZ=lu{4c_q8ebO>aWl?0z z>~`wz>fk3bxQ*dT33RE#fmQ&8AOv$FCo{EFK&hHQ;T?00!55Hx8C;mfL>R}iS?*niO zT``M**(=}3+Up|qayvG(meZBNwtccSk9h}KSi?o(V;*C0E}KA+YsCA4#po0YA1f>Q z`(-_z7NoXT6}*l3);MDSa-DZoSn#Q=UJp)%GwI!lp+G5ebU!W;g9%(-Sy&bI9vxL3 z-J05F478tf3qNztpL_qJ_pL6KPpFY;KFl=2n%hT-f<1> zKFd&D(A9A4?m5uR->BL`23uT0F1%^UC#YL+6?eJA8}DH0=;)j*OcYeT$U+0aSnl$5 z@D&Dt;R9>Xoqej*-qK{1#8xpmMAoC(n|z*lV{v&ZoxZejJx`oHgad0Z2H6$yOiL2u zD+dAID)p?Ey+K94LEd(RqDCxqeC#R7CWm_8xQ{R=43&g5ArAc*;_N?zm8;ui+Z^B* zocAr)QylG<#hYbo6;35iw?IR54NaP9lLP41!wO`ODyG?}H%DiH%HQzqp_5-A^E{^> zqdw55XkQqQ3)ricEpFS#?+i5f*iMgcVUQ{S8?}EUC8q3V+)g!LPJ@ng9a{+QKaBu` zB916gbHc)!5F@M7iqR^vec zd1_l-4UQ_q%o056$uI*muaD*r$+Q{EQal(;JWlTy->e6aoz>X92L z25tyF?WW^sPtc?2ZllM;r4UQYack(%pnNDbBQzhah8qe-kaWYOJ0;Xx%0pGr5)oKb z)HDO@J}*r=`)$8TSsX9oGq1uz)9gNprA=W&28+T>@|uNgTu`|d#G!^DpEPM``F--N z_;B}XW}j>+asBLunVov-3MU__tl$-c z5pqzTUQe9YwedDZJm&a( zeFdJ(r)mZLmIj|iu~gp8@ue~3h}Gl2SD&%a5>wI=q5lBYtBr6{(fc6xr5X$uxGbq( zXz@9ieO6_s0IMX?TbBO;$NGCreMX%b%%0MhPl^y&%F%mD!7?SN8mHExxW({3d)!vFLXLv!4#s6kTE8{^V*wY%kgbz?c9O>-Mj*d!adNnyT}Y+jDNA zT14nz+j$NcYQ(RRroUCUdoU5>0bL<_w>Z~&DZ)jr#oG9MHC2WZl2ST#^YVJv3$-Fn zPx4cY=lA&|P8auOaQOu37**IlE8@^z(m|3$UZ7NhTDe?jE6@7%m0o5ql$^u^%Y!IS zgCKMhHhDj49I$F~uK^cWprq2Hhb*oEYp1QTwB zG)d~jMR28;A%l@;q%0D$E`?*P=a527!B$9};F~GI^R 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 OdKW{6@kgVeg{@y3#-g3I{m!Y;f8Mz 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ⓈxGz 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 PI)Cc?1m6oOm74s2(}o!J delta 606995 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

#Uog-oIDnMx74Fc=b07UujLkN4 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 z zKxXhB-)ak(bFFaj?jQp)dswSyHqihX?ZJ|VSBWAAmGaY8325HQ2x#afRonoCxL&Gd zW$Ds+Aey4Mlm)!{^D>7jBxyIm8f%E{(F>Zs+PD-WAi9f=F+OUyWf+E}erNxhBPQ47 zBe&jPo3hRl&2FE**k!h5>N4nVcB%^KRv`<@`S_NgWW}*>D?EYIvYdSk`|^|ckhT*m zN0hvKeA_E#_THtkpQ9FJ=0Ns^qI#&s-L$87;*F;=98(i)r>O7-(Ay(_`3?g6Lah8s zI{rmo^e;8{FY0DwPW`d(aP=1#?HT#^cg7p%uMc<`zs~0)74gAWP zjRA%ou_gIHdt3kx8@^?h|wi;%n|gk^(Q{NAFr|qOnL0bDRr$*!3!o~0TOo*CQ;eigh4e(x_`sc=F=I(%^qE4gf@dZaU< zS`|G%dVc<1dN*nj^i$s8s#w9S)L)D%U-}jq{1FU%t1qbua(aZSjhnA6b3Xc4-I&}p zJO57v__S+r5&TKsk3uRha`X(ShfItZouxK0mcyNIVNO7WLoM>d4Gf(V;dU?bRJsY=%5!OBpVCnTw zRDBCAHY0L&ldu@}R51jOwpKL0jT^Xln;AIU^S8|*Zs3WM8+G99h&jwNY1kc!T-NQu z^UnJGc1aU~jVUnV2<3l&Ddd(jo(qE%T1% z9okw3O_7wat&!0i!7@RpWyFnYHl?)e+D_7AaB&nuh9lXN)U!2SBn))mI0M`z76tUm z{U=-+HS9uNr_9XbH1x31#^&NexvEZ~Tgm`u3IPq*7Y~iuyx2?f(Ho);EEhNXvUEg5mAE1V=&bWPO z@^lcJcE(rR%uVsj*maKWGeUgVSh}h^hP%G?T@Ah~MUz#n+}*=Up*!^na{S7~j@z?V z-(WxrEjN*``PEOfC#J;yPZJ0R>0q_zASwEYN3n@=zg~2U_20bSK$nWl0}auIvxkTz zpe2d)l+x~3`&{bHnr&T=5f8)!YM9E7+4AfifZyy6uAPz8a%x&3x>9&~)ijZ}Kq8p< zWQ&{O05+>Up501;wv_LQW?0p~DtbiLxLBpx=RMQZ{zDX|9u*tE;}!vb$D}S}h=8~F z0H^xmh1}NS<=05fZDWiG*4(WX{ZN z&%s=BKt+f*!~(i;oyRvj#pWbp@ZR-D#NaclV=9_G(aQ(F#_(^R7b)x3GHhZ8+{wY4!9kd<`($ssHjt5y z)YEvmN6d?_a9b(^u{s{Q#B%D5s0hR4==&%5N?t8 z3va?=LZ2`&b3WDsRA5|rV6|Cwj~uU00SFfg5l8;q3fJym%X^HXtVlf19OA&9h}u@k z^<-&Yw#uHpz7@~J$COpE9p)oxYdazK%EwYXL34Ky9u3|^A_{>`>|A_Li zJc1^c%q5g_(_d?q@9rh8EV!1L;B0y0frqwM$Q|fbBhVQSa z*Hk&3VWMgU-D;G)nmw|(C$3FFf*j<2ghb0pDfpy^3dLuVZfToXPo8P0#jE_#-XK+I zw^V|0!1{*BCTD~(NO+FlyLD-g>`xa0H zK>jE7n@a&mnb$1lM;1sf&Ca7fgh5G*A+NeAr+Qv~j7 z3#@)!>T64?-R=k|oGxv}JB6Y02yyr_u!S*=yb}jNC-C9YuR_CkR^LgnX-MxdZ=@c1 zla{;q#wo|J$*3b_SLk-EG%f$!e&!Y|Hp8Vr18zuMFSWM`fK3Fe4&fluJHV`3XW-Xh9(f8#3-5{$G9I}}_$96@CK!YLA7R$|!Vk zHLY44=3g|fCkEqMJ>G%&ri;T4FH>3WM!%y@4p8ep0E(@p+(=}^n0L+r{eYXn@Ye_x z!$oTVGrpzuxqC!@485gI!61{%m#)j?E+m4nyiM*^!Wni9^;493$NOe}QYueQsnI(~ ziK&T3+o|BssO1$}o6V zx7ad<(J3ik+yqCTBb@A@V}k79cgYwG`7^qY{;3W8iX;UQhui?!T6}aqljx=+f+gf> z;xBJ`ZVX}qz%pQeL_*>Li-!6L_e~xkZk?-eO9Y8^G#T>8tPI+xGI&-jWtr~h_o3Fo zk2=2-u@?rVneiN+FQ2)ntNTdNkN*PcA0D$dE7;V%M0cd3!CW~1iJqWWYEpbseRMX6DzS|hBcQU_h|Ih;2a9U_JFPvpkqze&l? ztF-Drj=+V+@lBUtPWC?9WfBf12^9>wMn2l=QgDX)I|6hGPm9g*u%(rBXTGg(q z4j|a~Ycu-uMk@w$)%L9Jk7-RQsg(ij0;JZQSuO-6LZh+R2tHUtDvLcPS4cL5ocmDW zW4xLTYW#1zfS>xPkk^KKBLV*J?zzTuy&}B%eJfi`AyGzWd>CZJ7(-GTMx%w#KQIdA zyVrV(6`GI;sGAHmT3eREn46US$QH3noPtA|*_)z&bTy_sU*Vpv#2~)4BmfJw z3r9|Err?1;CZfCrMUF|0Zb(LyAEOgU8|^q{>+?(k&V)G@*?2=A&?*h|7ApLd2efCg zw)3A+ad`F%&)~H=0V2nIIL)(zw=#xS09UB4+3o_#cYoU}O2|fi#q4StHTu|i&sphL zhD&>eWd8VgvXNfMSwep$Hzs67dB!-kBnCq!PexMwS9s#U1~T$d9zfp#(tp1m3J;Qc z%-^raPw@XcJz|hSNP?h!(k<2+fP4@Tf)pez04{E4pabW;93F8AOaqJ|HYC7TaQh`J z;0}gm_#{PC3qbZ?wq45X`U(HztNP{jb62;GYuAmfb#%q2Os|_1P(8pE2w2Lk9smUN9bnak1Ic&|Q?Ect2MfvoB=8lf}8SU{az4-?Na{jf}Qn!B#_w$Vgvd zx3=8yb~2V8X+M?)2`I6#yA_<>w}YdMmq{dqe*P6Wrm{&iN!ZXet|cBo$M+|yAwH=h zO%&m2n8&CN+F#299rpQ}c^{^~P{kQoNxO-UcnyrfingqzG$cdW(`aPIS~mvoZ>h^B z!ENH|+zBg+59%*~Ptt~&9@fCrR^G&j!MQ5??1+9btIOQA zi3A1*#8vgRdZ6H*$y~!UFfS1r$b9$#?4s^e@lb9sLZaO39pstt(5t-f=hSMSpRj$F zlRI7&Mo(q$6*VUEVWJ6v^p2UJ7)t;dGQ{D1UB?iIUqM;wRP1mI{e9#yqv2LI=wMX8 z?1N5FDa?oBBom?}d6gLd%}{2=lan}EzyL*QoZD zur%8F)UKEu>69v=Q%WV3tClO4sTEaBX1<8XMbaz*u3!G?tH>!cq)fLf&}Uji1p%X} z-hY*qn&_V{BS0wa74}`zz%prWLtogA!5?WPXp$lm6%(AF+GLf>@w#wtAgYbXvz#n)Jvt+vGg{aig7?+S8dDi{B#y zX>1cei9z5gj2O;7 zU)d*~7dB%5qVyqn|D>YFGNIf{L0zH1>CLffmww4nqi~3oOF1Rag)4Z1mqsB%w6PEx zv#o%$R*10o&)$vIALg;O++=?=odUM_Jt@N@b0^2z!S+>P|S=#b>SfE|*ef>m; z6ydTZe$(kG>aZkNJbB*bJT>qSQy0%@=;=MB@t49TGz9{X>D)X%1DC@Nv!~_U8LTN> zWcgxI4%hiSH=5gq#1>!{b?bQgS_O3@KN^WCZd**xZBvxQZBuYnz?!z`4X5+(6@iHv ziuU4ae{JtXuUPrSdfc1G67$52MSMly=3m*$nOJ)`(@FgP2XUKD-7e7V?jQXii02QO zELUZT5h4F}@VDY1y`iJx?;eD_1NIMq`0g*6Woh(#+bqvPV=pQh4NgZ6?fh^RJH{UE zf=G|n!@8I_gOaYs*o4j)N(ZqL=&KcKsSqjVtjPT;Zj#lRX=__+treXP>RE-2Sv-wK zchRd*+?5r`Wi~p!_9&pj&-#ushw$9C+~|W*e=}P+-FT7m^f*)Di;QH)kkRC$>Ev7v zHmKjYE3A5?(pme73e;uFQhK#LW2cD4Bn2YF`i9(0vuf1pZhjhXmzln1gdD|i{@J>h zt>aNOnwE#9h=Cmyb1vqKa9g!rH2|p?Pq~ceL1QR-2W2r%Tw`D+P}r65c+A$4KFx`C zc)1f#)PDF^-{3MX9=$`s-j7f(dpAxLxu-e=^tN|ybxuRBe)LOIkj;&yb0x?L@Lam%wZ}BjaNqfwH(FX4*{QRd;~kiTZb+q z2t2u5S}MSfB2v1xe0|VmND*tw2J~8Hdc`Ma)`9+L{+iNX#B}*I?Eg zn>MA>@vJs|$18N|eG5d&^r)?}?Bmi-0Xcw&Zv7z14NU~`17<*On2wcg)6!}c@fAB3S7}*6 zIx$D!$A|_!NB$3vG_7*F^(YL!0@0Qx=*N;5R&5ro9doRKx5bv-{RZJz+od0g^IG4<<^`gJ@oy!@@xFCQT4*IaUJ>%F{f zbF$689Fk^ivN!dU1j4vVnAA1Zn7$Q?7k^6z>7Do(PKb_k`U8xq%1)dZE+5riV4)Pa zCOhDyA{Y^cPchsp76fH+N@c;+i~PAEt!oxB$Eic?**3HfY3r}DX#d#Q)z!?ZPgVmr zj%gnkpN#?9UNMTnpBk5!=Ob(+ifRc^btW6kDoYRBwWdbv57O`S=9<%l%-VOic_}c1 z&#jp^W*${P!_dWRc{AR%-m|;@K0$bX+YiE2c|B>?NFIc1aQQQ(xO{OZEhYh99;m8lT(X1{ ztP}51Ew_E)8zwt4qnbK5o4g-w%gk6TOKPWoIT^H=FgM*huH4Uc@PD2eQ@cl4G2k(69hbpD0}0 zbFJg!*3D+N-21jU#yX}F{xdw{PqS>k_jAl#8A%d1J$CMs3`Ml>2cZxG8=mUAmc`H}i@K?Eyzgh}EPE1%dqt2@wcR{90Q>rm1& zsfTdJFja4W;|#R>%6?B%96Q^o@j&!x_8A|9cZR^TuMS_p-WyH8(HjHE$a6hJ8&lxE z5D)J-vr8!t;_Q{L&U5%Ylw>N4;@5{rR<(L(rbUp`opcj@BzY%+NfdGkI`~J|533&b zkDz3?c?k@@5!FmkAyJ2ngjD@7!56-`FuZO0m3!*J9zXwUoUmI0DR?WG%6m>!$q|U=7>@HM`&Dq4Go`r|C`&o)Z-o zVt|nu;dmgwy*1eLvQWKyo^&HX$7KEl<0ANNRLyl`bby1a_rkE;6?%qEe8Rk>eoSkn z=5Wco=$g%NU&gDJf?}2IO##YKU$BMxCwkGhV&?VdfPUWquhfjuKI;f%OC9R6fl~5B7$lFU4W}UgPFB?%~25GK6tNX#(3Ep404)$-h7O_36(^(Z$rhWyDR)Uz*2>k&IvlMu zhb4F*2$IR-Yl6w#R{M>HxuLBYcvpGv99_Fk#toUprLk_ZauY zV$^;a=TtD2Q!s9Nhdg_Fnm(PI)>&1oJEwvqmBL{(S%`9NV^RQsaf|qhG%Z!&(?!r+Q`D~eIpugNy2hZ%8 zgNF!j`8ERqTTP#FcMA_wShkJoroMo`C1srzv=^DRc^2B9S}0~R;?i%#(ApJ$)LI_E zM68CNceOBiWS2fKk>6S9z8?wI=mo!!TD&f9v+Z3{2*$mH*|Fh@6 zci+?Bd96&aKYq01{U4`y3bF$VddsN|fD`t=wppAvYmt_3ov-l!1Z@A$h8iXK9c1q9 z4rl}U|0)Xpv(09$N&6$f{P+=x^5X|tLL3Zs%7q{iVoR_m014*5KKz{`cwqaTE}RMd z;|EDf9}@~;%Vr?J^?w7M|8ts+(8({C?>*WF;{Pt^NGaK20GR)vxkYp6m?vit%I5O_I&7}BPW*J+WB(Yy)(e7Tib5Ov&2u5l@vhR`bEEm8#K;YJunnE0s7(|@qhyqXUjc^s z-F+=>Iap;MM8HKM6j5Q^9zf$S7RCIuqbU~WwB#sh7I^Ci}hJ%(?TN=QtL*<89 zWwu$Ktll53bkUHLqnNc4QUy&z``?BMRG8;Vk(gu4>0x?zY@)P*f0=fF2aC@Sdqu{O zPyT?sNn0iQu{9~R+Edep5dr=w68Rm2%0HOU#pNhPY4Q`E zu&8U{OXSnAWIs4C$dA<`??cP%1QVvU#?ZaCZF0lQoiBC=GT)|Ykf9j69oJF!;S!Yh zy!5OlL$m9q9)qTOw=Ao%lLr_McY;apim@AE?m;)JUwbG z5~GcE$p!Xnoc}d7)G}NMzA=P!<9*Cs8PIh0x@Ef9uMXwfEckNiB!wS3sK+k;C(AJ~ z3o`7RfF;I#DM#PPxR0?z)^>0-PHn5*ZSAGXJ=Hk(14;)?m9rV#1$A<;Vbs#ldh3l672r~GSnEgrUJi< zcbS_#!i27!iZI^XE3y61@V>h5{9n-1oYP3drpu%CmbE>k={oG5}Fu_uW654OX zHfs(Tg$q`q+y+5t&`x>y|KgJj~xVd$S_ z=She1(99c!Kai>w`|F_OHD}XvY0imT!DOW*QRL4jF z`9?!A1IN&HJhB-Q?SP9>zTRPHG!_E&yFITV`*5$jg}P|m}28H*}e&rs8HN3fKVRFa_m25(U zaCV<|^tVLKs$x~jny`Rwa8EZ>v?>J^BCEDYLPdLdMQ?dUkc7q<0OT;*@57CC$`I*R z;pV~`5_5M+i!7^FLWP&0c_fvdes_n6x|`Q&^Hlho`gxOd*8sXGNIGL27vm?SH!(RN z-$1>mET!$S3wx=YqT3NecED%H#2L#kxq>e0^fc3L`ps#qYZFS`pe0wxl(FS8+68^> zEMJcLgcpSWdm;blK1SqJCdhp=0oMN$KlmRe0QmEN3|7%9+RCVsXkXme*bTtDsbeg?9qMY9+z&Z|E|-95F-6vy(QQ_ z#e}A`mXu4qTo!_PGyy;Gjif74{cYLWbzH*C!x!z=jr{Pcs)F2kEG#j@ z_GNVa1(dvz@D?Lr#!50!Wir8&j{qJW>(i1{KA`8w$#MHne2VivK6d+9SbV`7)Rrqn z)b2k}p*Y813^ECb0>}r73!AWbmeWj6?U?_z=`;|s7cKfir`_InxH+Jyk_%UZW?_o` zlDm1g-fN@Hregf#yz&h%>gw;y8}(DrsA!@-z?W&w!t2(Zo-zIO>ZEAI=LTy2sV4lD zt)q=n4ya7msI3jF4ED`zo()CCklRlT1~HM{Y_dmEt+(A1-)z}62uFExA;Jh@^;oHsDWC7W z9l}vJYT7>kcL4PsnYXd=mj$SR$JMD|7AQWk-xeYL1(l>TobiSK(Txn9#Ung1zu3kD zrJ{V@P7-myV47a~o)v0hg0zS73wEcv(F9i!rjR7!SFt@S8TqR`BU;B&(3^QlJ#;MT@6jssKbPHI*^1mgYUciOWogzC#6Htdv!q{Ws4z_$ zmYgt|bP*?ea2<`=N%&p-M$PkQ-5>)^2rGpRl z%>4K8Awuz}ElPbN%PlSZO*Hto|-DILG}TazH^21tvvC zga{Q_qygiNwuJo;m|@J`kYJS{`;*w;4?05-MX-%MARanB5Lt8Fu+U`{eyrb&<9eDT zuSsjJ9KA`avPE?f($10`Cf|V3!sg0SyUNDqs_3b)S&cs3*Ur`P3XuQ#`Sg73b>nl> z5&QhqhLp_>Y5>wSZqXlTvi`T7$gA80F1xG(Zd|Tb^XvB*1uIJUfUTQ z-x+!&G;(JNyb6>K4GA&%K(*t#W&F^Fx08N}#lL}8-ATI54*G{O?>#IhY&pSh6WZLs zUW(fkCy~2+VPgpmf#6f3C_ajK-$D<>`zhS5K=hr|7iU!vBA~Fb9}AsGSJT5%ial2= zmx|ruBW6u78<5qcM|z3mx=epUnr8kI=xfYnn9dWji?mdI5B1o7*D(G!=rKeA3U%7% z4(ji+#WMz9r`!h0F1oq&XbHr!m0?e+cI25@N={MbZ$p&I*g5TuA_yK(&(%d>WtnjY z2g>dF9=@l0R0KbtHLJ7bSFVB7C^jRw(0cXraPwgjkB?{U9uh>_*awWMyo!#+fq{~Z z7MY_1)h4lugdj;HP@>*g4F`db?(&awRhcBTARl-JkRs1Msze5l6wU1V4CD!iCrlRy z1u+X(B=WS|Vs+*?>hZLDeRvm$NWXhyvFz2wi(dyrD8GTSC8Z!fHSx|Y%`AA~v^7$p)-cj4OXESZTMz#K{IZT!I8v*z&LpVx%I`_l5}lb%;I?;W*0 zaf-bcw%qxf^LRuNFK`hcGQJ$hkI0{A-lZT-ki~NF@}STTjRBlvaxw zKr3En7#)P0$9TFi2*;K+S(Y%VR{)I(Gv1;be{9V({aDgcxL6!0_$>k8L$O50CWxKF zzCPk}U9-SI=GkDQupRbPy?^y;f3!Ct`#mgYKeVe->IVx0QBbS}K(y-W*Mn^< z4HMzZ27`(g9#SFsRvjr&%PP)Bu)!wn@!Q(b8OjRVE=QU8|2l$|EwZ$BwPS5{*y}91 z94t0t49yirXVuNac7{Fq8phe)&qa&W!CF}MRJZqzSS#b@(VjG;X3f~dtA|xpN)mRm zs1{!8H)xD=l4+}xBQKi7g7B=<$ zBP>}##x0)bR2GM-wdc81sQ|}@O(De_~8sEsS&&Ap83cKdnwmqP1?*}SGh4t104&kNV7 z&3(!##=}!d2v88C**hIV^jFXkb@7zV)+M!cLB)i#_R<8B|{n3=8;n*9-7d<^6iFTkW62{_d zO_CbhIX~F6o6q=-g}plf5%dnEZj>Yu8S1kt<{#CfX+ulg-1~IwlS%I}R*PZ?d4hf^ z#?ObH7PUN!eRZVHF~JA$Zr-6%^Y!(Q*8~L|u0#wfT^PMjmy1IWg`ouv>dtLrShWnU zmCRT`=Ehuk9YnK=|m@Mk19NpHJa4Mx32!8D*oyB6kH*(zJT{1 z`dMk0(`{6?EV@){O;R3thTn>l^^WnkQN)&a_iVgAk&IxqrjR&XdWETB_20)ia(Wv zCqP_GU{}ri=ufQUyn7(kb(RERm!VK6Q<0Zdr=pq)MbKKxl~_Vbqp{G@dy%6iAz9l4 zaAS*o#@O}9+uMQhPYO2xyJJKb$*|{NKvCck zVb|%k=dPim2%W+RjYj@=2?Fa>N-;i;<42z@&4*{f)TT0IFWyQ;s)H68>Bk=%6fH{`bzA$uZj(46j#P# zC&=XA!-_SUNS!N(C*l$1++&Rf!#lWR`21z%QVdU>@{7^@{6^8CY9sYI{z)a>>V1f8 zlqNw{MB{CWCX*iz?{!4Q1L#AG9FI!-W%+x`nS22btHNB4ccS zFU7XgoL~oPxFSzfWPj(7FU7J1PfepV_*UMcp_`grb>TwLfCZNl4z8&a_DkVLTnCy_3WnD&h>8xaH*!#I)zq8@BC?puNN4kK{-jhtZKm0X``Z*cwRIkYZMs zl(l|y0u;W|*F{eDEH=kANGWAY!Devz+U3}_l+ z5r!Ug5yrMJTur8J{jJm)2Am!2mhE2B9#-($zEJWx#JNGnb8R7GgDQhjhxvi3RxGp# zmwWX3DxB`*-;^X=qoFND6b>(=lhA7PFg&)otc8{!q}!^(NBAYSZ6dGC4``4u96kbtv~dAKU_iW*!)` z6dPDDyJNj!fE-e-XW-)=H@Z|eeQ_S3ZM@j~6!9sSg)qKC{dzDQ89j_rt)l%^yDyzr z;3hCFNOjT?{F9pe#;}f1|H5RS5NQPb1~NOrn)Ld!L@xWN3BwERAyKjNDiP~wVfjhQ zp7&DhQ-V4|IfomRkoRIJ_oUa1xi!8UJO*yNR!0g>^)sDbX}NRguj1l-(=4m;SiOo+ zHk$UsS8JX%`C68_)B4D3AH!P*dQ<41jKk?-DIHm10M%#|%U}Qh z`DPB9#_QM{iHxKW@qr9?CdFx<0Y zeJ|!`)!LFP3|I8K#%a)D6#RZOhDP}}2E1+=h;waig(sU{*KWQ$PS0oW@3BA3YPX}Y z<^xQ?v14;FQ2{!lYJDc)#4^9~45ccI2T}naT39O(J%Ay)U>9P6{WU*Gs+_)kA$Maqbvu#hB$I@EQJKl6`C7d>^<8JD zUIK-YGsM>Byqfw6A&(B|82S(T2sWFI7%9G;TOB74sCc0lut+_3)=oM=72sN1c(V8VC`dRclNKo1)kh5guP z6=#!65M{LW>lVtST!he~pV#~DFTmajO-x%ACra27XL5oDe*3}rezE?t7|n5rTQ1i~ zI5Lb9>_kgpUavJJ(csDO3av(h?&1xK_lWET^rIlo;>Y3<;i!k>?Jff3porwo;0W?4 z{V-+SO2&{6870Q_nQ4JM$F9|T>|rJdJ`l!(rf)40iuZy+3e1bX0{@Ts>pvJk&nG*S zSl9Pd*#9rH0p$E2s4hvxM}EN`+1J;&a)Zixe?t&?HbTaq_$45q*C0zq%v=qNSwf

DX0Lc{NjP;2Hod@z0Kfv1n_}min@g^wldmPKt)$A+ zld9+k<{#R%+4w9K8^&!#H|A93AIcd5?f3@%wAO#AU}Q3+g_ydtz|)J|fd&Hm7%t%B z=(Z|U+#=f>^3i1@oXxJ{%`jL;cK?4|ePuwLO|mZTI(Tq*cXyZI!QI^*26uNSxCM8D zyA#~qA!u+2x%2IwvwL!XcTru{Z&mluUG+Tg6sHSMcs`9?ngfg9YC=t_msBb3Pc5`P z2sW}ztjcvt32iFNfQ6MTp&H-MQ}3JmT_x044iikzXJ|f4ps&$owc2XwPIi82n1mRC z7QnhCV3u&(&yJMs!n{RD?S6Y-hbZf?kdjEXwP2+t8=n^7M%*l68D%kAh0jiT;#H|^ zOZpl`nXNCIf@Floo?gn2Sa#gWr^vLlrnZXDg9Kn#e`(tH9ZA7T6fltRF&=AGJ{F#9oFWhn<`byZk*+)$At`nLey=X zxZ5;{F;ADz8|Xvsn@zMA&yYA~N-a z6{}1uplwPkIx{#fgy)wwEP-x`D;y7y!FxmDbr9oVu#_Ya2@V$}N!ncP&a8LeWQU4y1 z0O)R)-%jXB(b;k<4QaAUY*g4?)5G~qMt$Q``|0BUE2lNZVOE6$5!U=b`WGh9zuyWK zBtUen(=F%-|0TBlCkdnkDC=B6*VVZHE?oaA0pdKS`;LwTw3j{8t?~-wNbADHzNtYd z0svx|!T?`&TKLu!l1nEUEInKM3~y1r-n9~boWlYGg(nX3pb;KZF{XI=J&$L)XZJYWA|E25ZzoF3?-sk80(WO4z1)UV_isiy6G_p_!@zV?8g!4`>e$*bT;@C z?D(cK$Q!Z%i1(b^?={lhRs4vH(0ZY(O4H)VOUP7u^KBxjYu0=LLv%Pp?q{WTc(aF% zBpm|O;A%%ebx`kRcrbyF#whYHwLh#^1cf@rr`iuU6p>u{uBFw-c&&)~HOvzo^rQP! z;#K?HXCfi3^ur-m-${erw{K+F&E8O+xV(4I9~#(7fwMzkFs@OF!O^3G%8ADw+{-W4 zeCBMC6migmndqDDzA?fF>7(WwRad+w(j7e%-{swh^U5dvs8Qt4N-pZ&RCXh?tF4jp z_mym*=G99NUJB_qCdJ&}%Yv8{7`~e9!#HH)4rpMkIBiK_^J2tQe5%NL2Jk{YDKhNQ zV;Bx{0UKgrk-qHoP4q=aX$WvMfZCI4k0g!Dl?jk}w#-~p6C8fs&?*i^4VDDCW8i-+ zj(6|I51+E0N*hUc!ZhDiZ^4%JP7O+8(n1n^B^zsW32^SE3v^|)aW1@QJc%bCU=bFS zOcPk?=818ZdupDW)7+|^;KIT&-V(5k0T8(w0Hf3g6Ug6>*E3W1^qPzQP}nEfkE#l`oqvtpK^~A$tCAJ zbT*SA^c&|D=-zxBd!}CZ8tS9AHgawMV1Z)#ltK|_ri4?q*0KYWJ#n*1pjYu}t2I3y z3&>S-@W_7KOHhIO^DfZ9<&2@U6JgBlahiggRnDJZJnjG?IV(0G5lq%6r2#}16DK5U zh}|}J&X_&Dz$ba9Q|Sk$+36c7VZ9GFK95+EKf3I=u!^{qz{R5Asx}M%i!iz@XA#$B zRI3+|EM>^>8|4uo7;(D9{tD>rCrJ{J0PaK`qy6qRT3uehBgU24wbToMcRdBvFj3#; zvMk`13uka7vqliS(rj|eG>zg~>=@_%4h6gsnLk2aHBeWu5dHctN-*IzurW5OfRm85 zT{tUZGTHZCJD4B=^@~W7S@b|Et5_392NK!G@Baho^-oF;#TMfQL4$H~6+~J-3wqPs zl_Y`B_>dqWZiDPa|39SV{|Il7^Bi7*&MDNheP;Gz|#=nqj|Iy9ZW-@|K`FCYNwarG4DoAY;s5(F-gLDL)KLaR30@wCy7G3>s zh4Y5u(mJ3kcW&Ga6$F@n8_*UvkM8;Rg}V?%1h^W=r-c9G6Ua^w_qj9)Oq=yKy2jrG zT|2L^)(N0`heU{fn3DgGUx6|pLUzi1^rXLQ9?VRUSp7kJ-aohh|6?$d9LQj@Lv-NZ zJDxy5X!$$HwLlQ_axd)vtZw2RI{v>sL^wzP_}jyrN%kLepmo?s%t#D^`kz0Tl_8;R z^Sne~_`6u*?pHEIF-SQF%zw>p11TT*TP5$&+VwNYT6N@qe}%8Ips&#Pfd2Zosn*fu z)zhFw5Q6%zw$^v_oBwiK{}Te9^b=y+ASndM|1Hpf&G3^WL2VQNK;Qj)l^WCRuCQ3a zz;5lqz$ihLA-EZ{LL>-j4ggr7AL!Xb^6|!3LvVpTMF|cb90D9dVhnmO7BC|MA(0#i z57)1On+%VaIW?38pRwy-P`zKf>p!B~PZ?O@wNv}y?!NS(qwnc1sQE>oIrX~xJb&hp z;^*s&YiCt;wL!PfQ+3tNCNru45*WszC@KLOo`Vn4-l%c_(t$LUaQH9a3c3TUs+sd8 z94b|$N+<4R5LD7Mp^ID6MGysRwBa4W*AM)>DaV&(-2tKi{Nk7fCW8GS@S?u3!47Kz z;St{J|4Y~!{63vC=SuC~ zXiI1N40$aMx7QFbZl5Y(a|+GjHd0qIMtYOV;iS&fYbbA@DPZ#w@Z?nItB<>XCv??4 zNbV8+Cb*Akk|Et3z16vTfbKgC*||CzhuS$L{{F!t{CKgCp5c}1>>tbOmuvg^=0G+; zVE88gc$B@{P5=*`S%Ff zhdg<|Yk)A2g*w1((089Y{~2udo?STLHt_T2E&x^^0H+w$iAm)3S?-*Q^NPO!EdwQh z=cRCg=4?M(H-iY(j{#$|Naj$#;yPylOonSAST$au(U7o1_h$e$zng*xc ztd+@C;FLm_+|`_jbHdLj?WL2Tc(S3BK?Dq{m;v`b>;$SSDUvxjQT1x8*;y$h;}c}e zK%o?HC}I~WRI~0e3>{(OcVX~X=1*H%KL{RR5#IYNmW=qr~&2u2mur`kxX1?zoJ=-|7 zkB&v?TH%SBCy39QzQsMA!`ox)^T<8x$5xTJYz*@4Z7)KOYCl8h0T1ED zF_08Y) zt43W9SrA>K7nH}g{IXa-m=}-uw7rUQzON=-lv8ljEP}YDc)J& z$@^KLZjN)N>A-Rv<=ltm zPZ7j`Y)L%TdOAZ>tGqe~0x^TSEd=(}hJ1VU0rYM*ZOoCBsqhB@aYr#5v`NpuN5eXrdpfYllHOjdbwdd=q7F{e@vHpG4$>n z$X3~(14HVSD2rI|v>C$f6jo$Z<6EFQqHWWCb zbO^!cN%7B1d*W>)D`m0lr@DsN6mQAP*rz(h7iqwiNX>ig z=MV{QU}EkL2o`rac_Mgwy#h!Gi`|p?ka=KluqC3G^{_K`v>)zdCFrZO5WVD+qrI}w z`BOASwO(qj#J+vZ%?#*?Y}di|vaOi&v;OmgGCT_Sr@4l>+%-KEr-Nc&PevfT55E6p zOCjGUs;Hxix;Y$sxTP#XH-u^YablIw#ad=bjF`b~9mC3(EZU#Q5lv{}M4lA^;D#(Q zyrQVxtk_!Lzj^Zn#<~zJGUaZpVj`Zsy6f#XZ{n%B^J3`Cdp}6q-AcT52&c@nm z`bzCtw9?!HUk@U)cL~59n_Gh*H<=a+dCj_tDGML^U9LvtjvYgAFam4C)0Dpjh&_kXmwX)XZaP-D9XQ(Digd@yW#XPC3(xH$;nA zJp7OWc>HE!+6JFW98`i1^jcR9hQN(cM6RhIk`a~=D>b^Uww zi0r|Zo{j(%%C}}w+(|H`ckTf5T@eB!Bc@|KAP+7(($5%L7?l1(7@{b4H{ONBCNtLF zslCxRI1H2m5)RcFE*9cnV-d|+!TV0D-&O4AKJmbee&Ru=#^b@GRl{3v9hf*4F;bC% zk5goak$FZMMTdzWVbG6fH;ZCeI?@xLN%@6L5S~>+u5Z$rSW-~WDY@L2lxe<;j#NCA z2$Y_LhG80#%zEAQCV=mLAuj5U-`7P(<~$&H3k!>mE>ft z^&l%^2EUv~vso(45@eW;g}EdJ#o&dAZe7yin5%kOjhULI1#x=il2#v?gziO{OnOnR z1N4b($4XtYm~4?c^oSx@8gXRHNQ_B7p_*CKV z$Ogtnc>>!ay#oDxV2lvGBaTQ&<5=N(wB6x)l(xuI7TdWr)=}=sPPiU$uJ*ff+Kxt{ zLElDZ-Pep{gdNxpKfQ1E5x^|RULbX(X9#}9f3qF~Q;hVLi4N7Z5;)Wo=K?_C0nIWo zknoZf!v)a)SQ!DA^O|n##KX;p5>?jh#@rcz*L!a;0sRTHH?9L+DICr+cm?37IsiTV zl0NDM>|6zQC@x70!H3iBP~2xq+dH|A{=VC0g^na=FN7$RoI}~vS9}+CW+Oz-$&@47 zZ~={ci?M|xyl{b(jhX#XDsQeDpk}`5nCr`ffVU8^bQHR)6|pk>jAyJ*9*)UjnBL7h ziIn;H$iBv4*1*TUK~eu8L;ZB~mAvHTjGrT9U$ zbE*)1BepkX6~dj3SEVs0s(<_n!=@vbj9WDyhGjvKcJ^gAo95%uTuPh+I8**LKEC2F?|M?r+xo$yR`4f9nx2vhmh)n@R`;|q!vjkK)akq9uF$biErFD z)_x<2Z<+O|jUq>nLcG+9Q~{PgAz3Bp&@q$M@a$K8ns=n)LJUv3GyAfd5z@GmDkWqC zw8Wf;rY=H~vf+NY!|(7fC8QM9?+eeZqy;9Ad4rGp)~fEGWO0S)3ySN$k#=zaL?j&#=6DH-YUGX|D6f8IH z^xH}VraR)^DY7ZtF{VR|Mti%`MKS@C92X{WeelHlJl$#+s#qbZuXXDd$STdoopOh(^^62~>Ef1q_vbt2PKmA5N@2o6V#yrMkM#+`*V0q!D97rl`7WW4w<1siFBP$okekiSF zJ=Qx3yf+!6Ai8TH6;ArYaae92>sau95Ankc=01x_*iy?7_s-Bol35Dtv1m34=|x^Y zU^wxQ{aD>vC~${-HsPs6AC>cv`{zXu=OOUWGqpF5g^SzQBFQ?3YZPhLqLm>hV^PwT z;TIcMhTiPc9c-xfaUj=Qok1Gv>bKBBhbB)A8iFmm&LDznf}F_@lF{H_k&*qwnOl)nMC19Lm=86A9^Uag^h-CJ&&1w1dYmf zPRy;iD<-rk%3s)czWv3;-)I_R+z^aq5@5HMpB$dN)@4ibsE2em94SaCJY&t#VV>$6 z6wf4JVa09@uNzrHOCC3P;IzBfR>@ObwBFp|X!F`4zIC9q;D~tdtIUzpxb7^7LQDmz{(viZnS-w_?|4QN3$~3nfL(bIvpz zC%4Z9)@7N2Pm@=hb6qga+dXp}jSjwsKvR3CrQz)>|j9H~L(OgmXd* zKa{enF2$^^B_?{vi-o-+tcF@zOgOiaYX6_P>emmj(IM`b{r2C?H3XR6dW8o-=c8VU z@97_6%jru|1HMZs$_i6Gx%=Q2=fl(2ieB=;&c4cs?_?zr+nt>#RDIbYZ9N!+RBDle zp!**h@@i^Yhm2L02Pb{w|7DOoU2#H!17kqG3*Y3+62Tw&rN0 zaAA{e`9&Ihy=taUH;e@HmcWvU2~9Yc)lpicYucuzCILy0C!BmfA|_r_PlbeuDue5C zr|y9bv)4L?PdSpNO(Eo+M@%u--3g z`TmDGgfyou1S6pg) zP2!gxZ8~*vgkI+NMjYiM8-XZ0smjAMk*XKJoipT2p0q7IT-iKvrD00SAH%Ht^SFQf z)YbZ2+x(@IOG6))2DOGda^f86^f(_VV2HAJSTN4dO2ko!RcrAiCuCytE}PBUH9)}8 zf;fi7>V<8#?^k5~>zh`7(dN%w@hwBv#Zt9xQdJx?02b%-K@faFP$(SJ;M0ZsRHF*NSY%qRB z^e;ZwhRJdX~{fi(sc@_V*eB=){2gCoLbJ4 zg|jURH!-cPng#|9VjDxiA-tcv9RiOX(`02?)PayXw{pCF04+PbeG4wKflE{?ywd&X z2V0-p*O2e5T=J10p{gN{;Ez|AkJFj;CSvI>CN%Di-%RkL=-eY* z*Nr=7mBPcW4Y9a6q2G^ZwEgB&7hy7*+k+f!Zxn@K--_8%#xEUgNbVhh<^0ZV>}Kt} zRuf=Zo7vk$Os!jP=Szyn;We09IWMU`-5G1?n=|)x*_1kHCfAp)&`oKMmuon}3^nn+ zA^o0?MHF425go})|{2Yp+qZNOEYAoa|OIT6#IzP;lswlzQP4M67NgM z^X1QkN@{&SZHeSa$$NN#;KKbC%1=9uKF(KDPu27j6O)rw@+S=67%Go@7aJaF&@?@= zQV8#uF*_4Z`FDr zSUGu@j?RA)#yOcywAy%v9%HM3(_w45r}&nhCJi%3z1W@sOIu;ULP1LuIE_DuL7kIQ zv7H`3)Ro>DoWgLvw@6y-2PM95B%ZZx>3V3CU*Su7?Rj5+)9rc*&{Zb9gB4R9?VZBLIxnP3kiX^nHPe*=DFQMR zED{DORMamCDsVy___KV1qxxq8q&n{px&>#nw5FFw_%vF-CyBH{7PYiN=TJInlXSWS z<fd`>=pV`(4f@(pWU+P(oX{JsLdzxQgV~cmZs{cT7&f4|(6-|umQK24^%lj0F znZ^$lpYn!nTLeRimgeVBdxrFggVPk1OLP8#%)Mb%D%Alt0r8av&(3$ie=IdBgXb87 z)5FH~&8=>B#pdm^YHG)eIom7YwfKc-2*YMsG%xB3o}2SMXSo3tVB_Mq?ck| zUUk~xvc`Ev>djJ6FU&Yt6lg{br7vwaAJ4UTkpaKH+GEtN@N<-$Zhn$+4_Qk!-`hY4Q}s8PIMfsH+YJC5DC=gINs8 zj*0kQLIN9dF`+bSAn0qbV(w67!N55IQ*g z4djG0bd0AQaK8(C;*Lv5n}r9ZxVd7+hk`J<)vEpQv;0b1aK()=H4@H}oqqEJ9NaQO ztIrwt5cu}9r9&sF2e8ogM%=~Q&#&Oy+POpVSAfWSubvVXWath6^eY*%O_eP)2N&r9 zP!@urHEb;GQBv1E!tvf!75|4=Y4j-KY^VS2)rOcUlBLl1pDoT5!;ut3%6;5X&!b=%?lD|lR9Uy^)J!yyX4QAb z*{xqDMth1;Z9{8&amSAM8Y67OE;zwX_2(%E0|O=75xX$WYf5FaZ@{%8-i&~VLRPLE z81t+)mG9$RaZ2%OFG9Ntag~0;g5{J~LI-9VnJjC58bNnnjQ@S?x z$?|kF>>?DH67)Yo;^Y_xkr@KNl$2i7)VonLe8)oA=hZxv^Q6sxkoCL_{j^~9!O5M# zAUooq)niIcFiH+wKp0Kv7FU76Zp1LgR}@wPyGu2;oP|eWV*cZuskx6ptn4T&*HMoW=i^ba(@bcl!Q8L0BTZ z!F{11?)vK2oM4i{_Aqlv56|deSZR{Yroq&&QMHv?mY4Y1{w*plA@RUFm*N~gS|mTT z{~0Ok!?F;rfLzvx=y;Df>ML_Uzz-)Z6X#P38|ET+C;h%IDO@7xvU==;1cQ!k``H?I*?~pFjPg&x9!GpNwBH zBzs{SV$U^#yBK-rN+E8&NS!EKpu^N;9R;H{1P>>cQ|>$AE~46lY*2V$dWPc;H*WVK%Ojvs+r)WpaRh0*w%i_ZjgtI(4qwE;=amJ|L*xuv|EJEW8 z%Df>{;Sp0Jl87b8^v+y&+Swh}Q))k?J5 z0!`?_RYSocCCHF~*yAh;_hAA_2pEz;9yz4IGcv&$;+c9ZV7NVjC5;%IhT4eAQl;2qTbBU{olt{Z(7N$j?w3e*Sh05dPyp~R!sy3s(E%cw3)b%*ljAV3Oc+JL6 z>)Z2I8l^Rt)6uLCg;&Mm9iHVzY#MfV2aget%p`f|jcjZnja^Wb-0up;6&w6H*_~#O z*RuNcnXff}ESd%pRse~`iYJH@doB3BYozrF2wAJeDRVW`dy;#YC- zy6|OvLBoVWkkgQ$qKHNxietc~jVE!44TfL^U7HgiaQrG%iVcHN0ka+Uf{TJj!%i{E z%S57%p>@gzW+GU|;5qeV!e>PB){9Stb(;_g&`cQhR)mfYi+LFkATvip-&D~=tW;jw z+q~sesOsg5D&Qe;)0qF*m6XTh7_PuQ5pLxDqoRPfE3St3Ew|+wd`9{+r8co7TY_os z3{;Z9z4Xm$@&|h*1(xv8Foe(%#Y~HUHC~cJIrB*hFtCnOlC++Xt=(=DQuGm154A-M zL#15?U%Xi;DPT`C5|j6Cp0o94j?7YMmr{tptlW~tVu+squ3cGJDp6?HTa@N%gVyx!(p`%dE^>u)F2v% zCRet|W`fr2t5TW>>!dZD@1EO7qLicMSNq->%-jAcWo) z+AQL^7&tyN%__OpljjNuKxXPixzwaYaoE$#fs`7rFl#&6D5xB1FUD(?8~cci3LaY^ zzQAA>F0|gp?p~KBk1uNO0>X*r&(L2oLbHxxh^;~5-(!08w0OfyANIr|7~INu7YMiq zB+qoRT_Ge%4%?WEc!Hy2Vm8leQ{{E`+BQ}bpH-O@J=+G%C#o1W;4{j$mTvzbhHIUJ$HtI`WW_3$w4P^0^EGUXH&aC#Jh#wdrpmte}ZJltL3o=CkLmy09=@ z7Y*kjdZs*dr0eZ3R4rnuP2{=j5nMIR7}PC zK%v^brqRAhbO&!_`l4!23!Sr(Xretp7WzeHS`o${(I9RGZ8pXT-ymiMz1m_xvx|s5 z3fQ!#+7)D@gbV+q^4tSrV4~2A<5m$)4_vW>_d<50>LK5Tu$Zx%0n#5uGr%7uI)PE0 zO5jHuxVIE|P<5Yq;r~vc;O-Rxw#K(rmthyrg5y>m5I&Qa%r4)~T!W(mm<9-7a*MVk z``zs(Md&&v$sRR291d#=R5)o@D)X>yIs;HQMbtUl@UI)qH`Tv$%Z%($)V*i4D+nWA zlcvFjwP2XZ6==)Ywr2!;aS{ue;Z6N^@wwX7Y`;aBgum0|bxc5w`eV%wl%Y9{CEXz5 z_pFzCycrQ=RCF~!g>-@CKYO5BnK;9%&FLeriQgy`rC-F{?QuFE-w^Rc+n*7WzS`v& zmBWCD`hLLYRL%=O)6Nlb;3KmK&iy2Kv^yT3wm|E~WoStxuqL|;3Yj2M#3(SO@g_&u zh<5toI80k3w4{A@mncJ^So$-zRMa1l_~)R_J#d$ZUS%g2Gz*y$FKLmm#jkRmMhzTB zSqi}iX2ft4W~&r$18ZzpOsT(j>DGvK4n^8^%Lae5LFyc_tWvY@k@C*BPDqQwT#+=) z@A7Dc@$-fTkx)`U(HCw=bj+hrx=C215LP|H+8j(hkh(*V7-7N#e=>ct?Hpu~5fIrV zUx<}KNeYdK{@_6bmW3j`QBp)+!xx3ur21CYIH{7wWujz?w;sKU#pP3D^UXJl6{RRy zoTl57(#LIIv1tOXoRfL>GdBK6D|=#;??qo$Hnh|)gC_m*N$jDM*0utTU_ zasdILQV&ooAd~)*NQY>YNB~=W=!MHjJ;1{Yk8os`Nmrf-rWn@Y@(KQjTSYqiu9h|u z_1Ky+^+}(NHiYe=z$)3~u0jXcOvaH@k{+Dy5m~#AX1}`&?IvADKVf5d=sC|S?UzA= zHLwJE;VzODV4r0pdQUQ`LOQicC(;2NUccSix6n(I`FjK&qNl{Z_VM#H`nlUa&E(i_ zb@{+iQdnY=m8%gmxyDvywkwOIdbMN%e#-HvFlcptXyU_qFzJ19x!4!fdScCioY*rt z<-Am|htc2a3$*KRn8c)_?rY0)p|=&3od=|QB(X3VKsKj@%93Me39gvb6GXrP_`Uov zW@C*1t*=ZjYYXFQeJe!)NhNR|h3~xPD|z1YPJJ8_M3hZPi)}ynn7{pYk8s4D3;Ahs zSGYh_dpk7DM9Kj~lH0~e`KY~^jL<~n)6dUqO&O{=cz1^?@uJR@M+9x2t0>8q^LCaG zbensDzz1tNe=Mh(!1Y(O-&YiPTZQV*)WZVzfK`}|=Ak$A(<9W9XkX(DFchP+Zg=Z| zBm|8WRi%^T&EBzooqTRH?w?F94cUj~-yi#k5O8JO)3LqVpA}Uga6ZIBVvYxf+!EFs zcI}HK*uUC@bz@5EPkO5c=TYQ=*~`vry(+@617-Pw{h=j^I=oYR1b#puPAgaoohW{y zf1*-KZf$7znjw{48jL+WRlSRiyG&~?7de>$*XG|QVxvQ5?VF80nJZO(2Bkc$m38HX z@amd6)J$%8_jSFXa4||OpOS*g`>eM6CULjDK6!&@gN|~eC{=i?yO-vSg``~(?o5`B z5lBB8wJP%MkWFmS`YQp23F02?A-c#%`qX&okIx1$Yj-X*iMqzYUBOeM*W-SA@WXd> zG)Z5?JG$ciW*_Rsw!t3mq^wf8Mb)<ye!laM;2) z@Ek);tJs0|H-;GBY08yPgjXCs87tv2!t1JF18{!}EWh!7C#RJa^zO>I!D3U1s|Ugw zQi_|1V0!EpRHR4ReoIY?Tgq!~=v?5^^xU`Qh)`}>Ng8~>TeX_jjkW#eo#%!4p^aA! z(2H|SjGB)Ur@v8rJy*5)fJ1tQhI7XXI%9=&XRYcwQO}NIQ}E$^Aejm-Q7TYbYg};m zlOOG^7o5amD&IKee9o<~s-~;oaA7l~ zmU3MS2#9k(5&UUCjj8cIkXtn7C?Gd9uZUV-Tj=5;kS0|DVM&FldSBs7CV{|YF+Vx* z)ssX1-awca%5N!#{ZcQSlpZ?+cz65=JpsxPTm{$~$QZYT!;5CoPt3{;pChCwjqH+U znwadIF2!D>t1PY<;dx+p%$-%Hh@q4og@wf{vyO=ZjWgfL+xZ=+yCSZ2=UAZ`Y~tm| zJdn5HYjut5@qz_(^2=M@xf6kFen^E!yX9}Yx1UBGyoxr@jV_m{oyA@$bQ41gly}N` z^p`w-hLqcm1q-V6J3aL`ae`9iQm8FMm6!yjbpY|IW+QT}=Eh{Qzb=LYp$j!Y%DBxJ zwQCW9`IH}E z8oKt!bdvByH24I}b{9x39DD&50Z14%5WFfdj*R~^6vh{D{!Zi-a>M?d;(Cr5mUE{LKAGr7gv8BZ-bEE5Zh0^^z41Oog|?;>v( zGSM#$y!64IHsFEVh>p!0=eVLBa8`)cqA?`W{4gUnF@;*X5J&3`PK~WdOh3{`!)S1H zJh;oC%&bD@^A40{A^(n zK@>?}hJ)6@P?#TR?t+7N!92FTkjY#bWL<~x-SGyK?4zC^pm6q!bYX^wmbEga{-NO! zt6A#dtpH&b_zRb9MOYj`FbYLDF?T4wTu&kaIC=_BtrG+!ZBm?9-QI#3%w&Jt?f#^5 z_eSNbke@$y6*!&RmqH@Cp`iVMja!ok7|pc9ulvcP2jmx_F+q(LvIl3uwJq<)U43@0+Up4+< z`(V5h5gxw5e;UYd0}Qwfo@AL1cZv z)98=QQlyW4qyN(Zno4KI#Lo|LqB||wI;G)UZgi9r$niq`ZchE~%ItR@c!%voq6>{M zE>vxd{M?1rqh(|A#_V1l3eg6ufNO4ZJ+I%dn{Q>HE1HQSZ_GiQm~2{LYkCJ3xU+OvX1lrf)_oIV?%u*v{RS$H zp~QFqH?skfFWf^noa_u`8~zke#>3`cjb&=eXr9tcF^34Fy_oza-T*kYjIY<`7&J+; z@P8XuB}E+r=RJoDBYM9c(@N#R3e9$`$Wqd5tX_wKH)VSqNPxIHxTB`qU>^|OYZ!zF z%Aydy@^3mn5rnU6p|&&-(GiUCYw;nWDHZDOrORJxodw5I{Snv1<}$tz8j}$-9pX}| zdKn6xUw(7>#rE2{@a2v^ENv6w@{ya6HdK}F-o0e_a?Nwzv=$z<7$YUIXPhaCB-UV) zG2~+ZS|&;&Tp=Vyg4ot691ASvj@OF;IFeABKVIaBvtZSoLnT?_!PGTyVAbu;no7kZ= zT<~V{_fThuFWObaq#8P*ukt49$t9$rBHhGR#TF{(ag2C(r2px+wYb;cPV-6?z_qAa zO}7PAle84|;f3&;##kr9VH9pP!((jd!q_xlngtk^!_ggqeT*ZPN_3k1RD`8Z?A#(^94&4ADsa zoHhA+6psE(%l!fV2fhmRUtos#{00gXgkWGy{2Ab>ppFz!(;jjLlRT(H<|hk)itsN) z&}YTWkO~lRXfw{gAgtOz5LP39V}@q%ekIxgb(svKWb~Ur;`{?Gikh)4PlDX$s14YI z{tF7!$=o=lO7Op(AxsJ+Xl;dt00p?erbSGLlBNQ6xb#701g4_>3vdxJBT|9n zQ`=`N0L|ZRE}^Fxokt+q*8kIXexpDFn=xSn;04a!iV|~-@NP^DYpvToPW{Zyay-sq zx9t7+c!uvo{x*s>`c3cnuxQd;C?2Yo+Um&yqRmNnIFBa_M}1Sn`SY-U_=o@C3|#fV zmdH0)vKyX3GvnD+?t2lfR)@}bJTD^8Py>$1F3i=g#T(zguMC&d%>N=&q(EFuFThb!7EVElxE6HuJq}jJ4SS2daT-&CE93o11vsLT|2<5-+F3r ze)npZ{3<%qGRfMrZ>{mP6yPsiP9I;S3Q6{qm-t?1#QUzTymq`TZ@NJxU$vVZ-fiub z{_gMzYdjYmXY~GVrLz)tC0pyY7fNDO<@axA)PwImg~=aZVa)n=oq3rn zAk+Abx9svYz3F?uA9|@`9q5|r-GJ^<2)nm3=!=DC$ zr)#;Ku_m!L_8b1;W;}YWdq2--+n(BKPfhZW4eI^+&re->Ogd4)XsgN(;SV3C#j8vwOUW@0<4|a<04p}A^(%C|H@Sn zWE=TmP;iex|2zL~>;VUVhyTGRj|h8E&l^1Kzd`0e5?F0i&HxX{|D@hk)S(0wnLxk+ zND&o?h?Fkf3qX~w1Zr`+a|0axSKU8ytbv$d-$8QZFm1m*0nmRd@iV1fI|1cyHa4jL z4WvXcV@C&i(BR_+S`!~=a0#mIG8_;A z@gF->e|z>>%Z0 z88_honhY})62dl-d;t63Q$z*|Xib3ZorXyt2GF++6#^Fi_7>OvF&+yY#QMtI)?EUS zM*q(||E$wkn|n$i3J4pS0t6)p@|LnqwG|MF@|T_Cx1=i9pcyn^T89DTf6tx-xl{`a z8dHMG_-cy9l>rp73BDPom^%L9BBe>p99P1XGWDqufoBR z63R3Xxo9@*_>}K!w9Flu@k)}sNEvT8vv!x--ZRy7W;HOWb*i{G2JVyN6DT*IoWXk% zw5Q&*q=qGzq><^Fh@QP7HL4C4D_I#nqVaI?B7mxRNpwUJb*ZZv{_DL$CUE5xWx*|_ z=PY&_Iv(O&Je%@Gl(*RnaAQUC0^HNxdEoG|H)-du^N9L#^EFuav zUbMBL4RAVWRykmE$$DVW&Cq%q18F;5mCRaF&$bY6d7TXx@=5&OJPH%E+e)2OIZ+;#Bd zHuOH=mfw*s2GP_?8)R^`n4ROzX2+aV24jr}p{I_KP_4Oq(~i+s(Gd)dfCJ)-)jJ%u z&PJETcJ3cvs}9wn^$5tA_t>Vnx*@+frI&mMi(hDE#xCFG!+-LqXs9 z5aORmz{vnX6;rkq%mTvy4u=(pNSK-b$JIN9SMqJ^!$~?x$F|wAZJQn2ww zedQ*3#(4hyvVU)@6awY%&X7NcboqZTgN`^5Ugx4l$M`P(xkxEH*2qLD0zPP{DY1P7 z;DAb1OGo5oOdpl_#|K&P7jZ;(hQPqah988O-^mU`WN3DW}`q`6;KOd3ft$KyG)A;%mm{AY+r2MZ(SV zrsI~k?Qti!>BI1s591F#>?-gbfnGTSaDe=PJto-z(vfE44$L0#4A>o-4%{9t zH&wUyXn8)W#4f6RPhhJ)bU>)-N18GD5bz$0K?3)S|@)Iz~*qvo7U_k8! z@4}zaVTU$z*#QM&ERlK!Z|dyHArH`~^@>grM|$0fLRZv~U?;;nt)IB}J1Y^21BnEr zB%rt|jE)LqrZJ$~U0Kik9nGfMfe)l9B1{QU7xRk9r4=?aiF|38Q|2bKIV#&k23#rl z_F`n#KOJAggsb!{T2U(T!)VQar2*t{=VgY~#O|Q9B(DeV%st93ClBt)BJu;;YIU(E z;_KVkvghhP(&G?4LnyeCNgJq%86md>#uG!2;SAj=YoVf^X-6yyr7wX9mA z9VNDlqUM{A=EUf6)d|#&g^#r6IHr0VrQ9|&vkHQ8Ig4M_O{IT>;yIqaSJ*{WfokP1Ez`MMRJgZLPraA%N!lY(F|tc!n}Z4$ ziTwC_l@&A^bxEi(=76QnHQ`0N>!ZB#6Jo2ldss75KeyFdDcB4Eo1al|thz`?tejy( zU#gVgCD)gs*nf*WXoKWT*1@6r!?2ui;n}dFa`B#P6l)`BxjxI6(OMON>TF? zvbyz+q!zyE-(T(=8_{w6rhoW-lSyGGg(K##akM9$s82f3vEEdXs5v8cmz67>oGtp> z;1Q&dQPqL3>9)NkO!oq>WnjbZ5Q$iihXc&Z2ElN0dN*}&9SV%M;g%}fTS^w+ot9Vi z1FFir#kO~TJr5w8n`b6U?_fA(svyiUc1c zFBvd&+kh&uVa?&}llH%SRC6hy$JZ68zSwpSo>fY?qXVS0D`p1IT|#=AaGy3oJ+NIj zdXAP^-NmUiz6gEBUV&5v@(_MCnJd9JjA!q8shR8?r!qdFSSWp=s7NFv573NU_}S@U zl}{5QCj;E89`)GSqgbrN-6~)yPMgN$4?|8W;g!3poJF|B*2)Bx^{*yGDpdNnFP&O*6nN}}J>vwi)a0S_|V7pJ!1pOF|-F75VvM-wiyts5@A>J%7Wz{q% z_9~W;Z4Sebx?g{s2mCk>^Qj=l6Ql1L;vVT@9{_aljw9ikOl29CF-sP-&b_b&Qv2Pr z+uw`e3{q`m4v_;s4?}P15Nu(!gn-#zsP5rYd$R430J#U-*GQiNS9uDywa&8joZeQi zlp0=JW$LlXS%?_Zlz7LEbgD`Bo*;6&<&lm*r&dQmmk#0j=#P|em z$k^aj`IoNFaWOVuTz#`vPbHT%!yi4c+yI2fM2n4)`7q?xG-FKLnN>{Lu|I0l6Sf2E z69erkxJ~PLYMUi2WM#^TqZ+Wcx-dsV;_B*~BV`2?$F+5&{SWvpqzr76)H%2gk#f1z z;KfIOsnOhNjy#jau;D08$m)YOoy1mI$~*q1+$GW_{!SjSz9fg|8j~?FGPS^>bpT*p z=`91LtxgKC4kT=CW+=R360F#$m92pbdYYZ zc+!Eh%);W0oII)-1(6A*T_4zI{^ZB1vQ$ZzGQp;}^*cZIM2${5@1=EPos6 z|L?H$&krOs6N9q9amwWPz$2DY`-X&{g0DhAmC|~O!~&S(1&ZknD=taZ?kha-XLoy_ z^kUkcQ0w}9I-~Q&tx(;`y+IPGNUT*E!WN`SQVA=dvM!7K#JfN~f!6=U%;_xHUL`K- zQ0CLx=-}wtB~_w&U+fdx#kPQ)WwLZM31R6H;k+WYh_pwR-Iz#G~ zdn(aqr3o;9ab{*ueEh>M&8}ekC-n{bJKMp2#!-xtbm9t{>{SJZ^A~Si)#90Yn!`p+ zLo%zhaJr;Re-oo$@>C|+O`IMjosP(mRO=Gs(Q}oZ3SxPQ;VImIuOkqz-W?*?_nI(*Hv63+ ziT~gD`_H1OK*Za6elMC0NXpd(k~JtWFF&AJ?-EJuzrp1!`x2ksxBbmMRLa#b%D*?m z_v*r@i2Iw_X&dL0x2g~%Gm%Hki{OLGApDM^fql+7@uVnfi}Gz8HE zGk=h=OHKn2U9PDvx(eS7`>nh7`=(ezat)_iQ_M3aOZ~*mZ^<>iU2rNmugC)Aq087; zQ7&45g5}#L<%0l3MU@b2$+f>4%+oF_!lzpSC7K*@%H&$bbU#odp6TDN9G|3FH@j7x z|F#c^^+qjYlB3J2yLr@F=Fiu7OK?Q(Leqj^8V&S)FO!lI^)r-@vm+-D3|GqW_wyTF1Yh=TFFRSM)|F`cjM{XS>zRW`>&7c$nY(w`lb z;vV~9syd+?g;Q10elK|zWI@I}FR>DITc>{jv*bXf#n!k>M@QD=H;a=RJK*7ifo>q! zD=h?2^Wu;(y>nO?6;tE?xqP9(V98A{vMH339|`%&45KG5gx;p?m8*|zq<;$_E82x? zVrTfOtjD^Hu+w(t%+p6w#LC*Eg4H$D6sSIDlQEPCcZM8=q``{L-^I3y&`^^HSBK?@ z4Rref16|XqQMk~cYWLRHyW5`k=*ViTx)BVRvYVtr^>7qFVv5#WsK0#qbElDv+@()9 zwysJl*ZTo2`r-eENf4?|e`tNiBO__|iM72)#1))`3}&?epIEkC3!NQiZ?iq0*ppCHRfS*Q0XTYMiHve?AY!x+i!+{LOviQ z%p#YZ#t}1T6V!0OV*7_ch=|6_FdhOtA)V`ohfUWYtL)4V9U_~Kr)R{DdkEW3al~W9 z$!Lh+?xiFsDNAE=gB$`6qZu0+7;%VG_Nje96y4w>I{G9!rsw!}+6@(w*~agM&U@Ic zz2?sFXn5{%3m!n@63mLfv-I@OB7mxtr%tTET2=Ce=p~B8WnkTu68v?8&RQ=E)&v~r>-0oSyP>O3K zoyrdGB_+#@Cx>mqP(9iW@eXOB*6ON&H*^ROA2C#YfJ{Skq#xI8GN+~FqOrs8h?RtV z?Nwu5-S)f8;6J1PyWF7wK>+HpP+n!mf&<^LVb{i|0c%IV;L zKa}<}rRohy27n@f@ae%Zqz$ePC%}zh6vUIbd#hDt3?_n3uRajitl#A4r*FcATNw1iBPE^ccp>#A-mZv%Y2eE#64D+-83gwMqaqYSj; z3Z=gcoB=C@+B`v2unl$cHaJPKV-tRSBH2i}=I;{<21vR}xDxRo;V~>kAJX)XXskiG z>ZV7x^WA_!31D#Do9_pRij!<6p{+<_DOK;q|?$0!-+^CZTQ;!y+r62 zzt@U0sE0W;rxJs)WNaHPhAO|?$ohQ@JGWp=EyH4>tcmWZt4@n#4Ag(^9!uPrC{mep z-1PTvG9ax<RH+FD-OEnGm*oOLc8U^X_5k$r_wZ zt&D@q_@o2|Uja;(l9X9rLd<@QxVXNOz=p_S3_t=s?LK7ISZWUw=5$;fLl{MHazZoz z5Q|oEJlC>0Lm-&-p!}qWv4>BZC9Tl#Xb8T~wObdlNK)M<{{JaIoNuZn~mrz!6N+pjwu=aOHPhdJ3kLob6r4Q9xbnDTn!xawvAfYixyZAe&F%>;T*t#ugFg zHt4$W3oE5hu0BAaDPRmp=LM<>b~ItII|y16!p7|!^cJ-b+%tyY%~$jhG4mYxb;Yz` z1wBT_5OLO&xBzW~K&6r-g?MH)l2y*21ydGr*(LidXPN~=?p@dnT3L)t69#_+ngd@L zwAsv?j(qm~nwtyp!AXBWUQ7Y^wC}!eX^z~p>-j(23IF-~1Ra1Ca>9R`=2E20*8G3i z@LzBM;Tq-pz)8bh3+KuCi#K&sJy}5Tqy~sEHjqY*-}iES#W%Kru>u8BBH4kwpRq@L zoOV^)i9|-Rxvx~aIBdO*VJfqsPH9qkFsW^BxpV z_qIEzYV<-^_(Em=*#-&-=uU#yRlafcN!-2q=y->}y|DcLfX)0xJ}Kn`dM)Sk&h#l# z^i{TpUHHuQ-Y%`9a)ZyC@sJNy{d`S}`gPh5c&Wvz9$B`PyxX4hl1l%&+1;G`st&g; zcUz1BfP0Ayx*DCf6YYEE-9Ht+_~BRYejW6~7rw-uynHdX(cL zN3C-S$yQMy)l4WGD4-iHNl(gAo?8&F*Z3Cl@kJ|SN?Iyul+SS{{e>KVI+5^ZuZqD7 z3!26lo$Bpvi4#X?&||h3Xeag{(!XvfGo?lgD|mE?IeBMsU{0S2f$^`dF79@eGX;?8 zTUTRRMq!N}1TEEkhk>qcn36mQ6m5%K3mfS32&yf5YVehhKQ0ll)idu{Z?!OBNilu_ z;_V_i0uzP^{A6!`X2GZR2g@-<` zh>C&3xbg8O=%YgI%sXP>u^HP?SBfY8wVrQG7_VMryTHMl+m&n2D|(w2Hf1-*ZK>vQ zTRI+1@^GET>pd}BupsSJe4*gLX(IXr7&P2B47`A?hyBB7uHWi8oUm^nP?#JOEf#O0 zCRY$wL&V3_7Y1SgCCPyj6O|5W$m@ZCUqd;$6)ZaaQp1qUZ1{UCCwg@P!qSE^W?!JH zseU&36OA$c*x-h#*K95n{&d&fToZ4Sh)8L=H}3jTQ~AhcWr_NrnPXs!GOHsDu;Qk5 zesg_+%<`s}k>_Bh;j?tW5)MK^<13&zlad#q(sAAK^ryYw07 zcAg;&*9EtIJ;pgPDQ)N_6e-&!4i6zGz_qwd8j+ zjQN4?cPi#Qn*G1aVw9Id(uQw?wSaH=-G-ewjCDRC$AKzKLr!BG75C1`0dJXIGmi}SF>ytlMU<5-#yqT#+I5Jtw~^xfroI^$F)-K zf3dZkc>Q6%Fb7)`@mny;mtI3Jnw0Qsv2|tNBeDG?R%zL?l%!Qki!ll)DIts$fVBmS z0naI4DEQ6PXogV)ThZ^|`zx>#3kJsA4O-TGAsD`Np=writzgz<4bZ12y**W>7MY!1 zBC2`A8r39GpShTe+n^|fbj-pXEXJ}X(yrX5nGe?{mQ3exPMP>x;#4h~xj_1cx1*Mx zjEWT_3}=rtGF{xR*>LfzLhj07Bq}Cqa4&)=FW8XT zBVvv>bDa~3_iexE1UPUvgz!ZF_C9M3k0|TopErYlFl$KJlz21a!%pz0#GN_e{kvEK zPrO%5g%vcg-R-x%aFXM;gCGjwI!PyNaSzU2KCAzibO9wa8b3{K}3Q{8LvuidH7 zonC|=mDgNZls~0{qm06DjyP_qJOPGXFf!OR0S^p3jDRVX*@*#t!xd>e_N3Rfa<0La zY{e*{(ly6ToGTYfIn(%E7?{e5DWCaj6XRZuP{Ka$Hd>?e6s3H53P#mabx&k(_07Pz zjq*Q;RfKchq(+MfcN~uu+>3DTXxwNaVv*Nr{h~x@9F}}&jgHCvg88>M@b*>*=T1GP zp#Cp%wgA7TCPKFa7*e*+V;NX=2RCj!wmfQgbs?RN#2`!-`!hy*8osZJvZNY(Os4$J z3Ch#=MA8!qYr4mkLC63Z&Rs8*lM4FlS=?)I5DdPS>ORcPZ z38pyy7VpaNLlhIV3Db~dHfHN2$w3S`i zAbH+AvR9L3L>!Nnc=DtuQEm)e=BYdBzfi6!$vgc|!&>2su)RNe{pEMqn@F5zVlky& z8WapP{mP8Yvy6E+)u{E?b_bCe#AI$tD_CKxzd%3G0FXMSafNgBM|+ydXkxY)9p_>SweX#>_HjB_zT) z%t8>E&~Nked@16NiXW$iuWoGO3Q(~(9|l~rhPZ^fjyEs$6z|f#LSVH#@kGs;n@#6h zVMYAfg_kzGLEiAjI!usHq97kkNiAR(l2#2)RS}cU_);Rb>>PXw_kmP3DbKGC;g~C= z4hq1`;I8VEh~yf;rEU)O1muK0XfQ^FpA&~r!%>}U!~Mj}9ORIqPa%h^hD^?}(*+pb zXmCautJY?u7uW7Nl(ZgVR#5ld9F3#Rlb+9TWe}^X34d&C#}vW@TXf7KVeUK>p4UUW zwI6n4sk%iGYl&XAt4Oq*NW5cCc$e$xyfJl_C7i#1^8_eoTgy&b7^#$M_5VdiZDcB` z|4=Q}a;eoA^zbdDnD9j8D)pbP4VT&Oa}cSYWCf_!v;NN|#)KJ$iUJrVZ|g z3RJQxSD-F&=$r{ayx&M`FHCXkD4A84zw6(j#o`Ui z*&qj->iWQC^)qa8!|_B#21@Z>javeK9p(f;xJs5S;Y&9xY-R%nk5cr9lHZ$IX+#bd z@7>QE!m~Y>{r+bNOP$`A6ETj)r23~e)2qQ@cCGlJ9Ij^ronZsiY&Tr2*?9b3#aAIW zrpezVeClgQNK)y5 z?EYxenuMB!`WY9U4Hn2Kbk|X@sDVh!6>kG@S5+tJ{j8$$mXvmLCkLF}RK}>P%B;gI zvYp?w_V?<)YM^d%?y=g^%wie~O_6|4pKKJt2&k0O&J#@dbjOWp(A@krJE^-B?7N+1 z_IqR_auh0+itV$RJI(#ODz^@|;EzcF)5VyUIg%wxgP&zXP#QtXN&y-gQ7lRk&JD>Q zO>pa_cuzB#=fw{gc|fA2koFd$@f!A7YuB1Hgl-q_LdBfos070*|dD+X;fyR>_w-QwdkBWd2BB;MiL%ZG7!rrcTvc&aO#A?huC2{%n);!OAh9!|NR7nB5`2R|uG2 zoROQnm$-SX?wytVz9~JkN;Sr=$`A6=5-o@w2nu+I$s&_~t^)ykIDkc&f2TG^))o2Q zy!<+QND2oT7=C*i*I98V@M@ z24W7wl9<>NajEW*`O;FJVebgH`hUN!;_R8@WZ~bu-6G+q;olHH_j3D{h`RaRkEv9CBB)8QzmU z&*O+LPLLOq&`p@dcE7PdNPcwuw(W%TdbVWu5KQZ>mCF^T1v9o=@A2x=lW+sJ^)GOQ zlHFrpo}qdP;)!Ov<9fuassO0}wu{2L`5AuuAAF;KhH#qNAMMrOA868Ofq>|~StRDR zbT-CLPVRImv1drgDKl?Kuqj;z{~E`ky%HCb_{d&<=`y|`2@?46fBU*iBMAbr5D;L1 zQ-#)R5BuI`-L?{*{nMANQB;son9)J=<}bYIjSdP4DzXbA1u47ye3YR&NTx_ne-Y?G4 z!9qsqc>OvUW5&esOO!MjX9qC31pT%O{;g^%$tPZZ{Hmid&|o#9 zZn`A(?sZEf^)GczO2@{6cLtcr<6BUfs(-!05;WYEd8?DJ3T17MSQsts=Qwq!g4M}t zDj6$Mb`2R@pxuAiqMWWlxg$59Z4hoxa_SxxSa*mtaSe{8oOLJ{bOHnmHhxjzr|7rC za2d5IfQx)kVpb*ZVr5n@x))F36@{G%3Uqfft$250ZeoSHc}V~2$Aw7UMe8O*Vjz|t zNLrM!Rpzm&jdmx-5AP$E-EGC`I8+E zP_w>oT80B|Zzv8n4owv7!7cz@(R**LRo}a6?vqw zTh-|=VF~FW;4JuuPOoYBwQb`1FpHK?MRHxZii%r5`@IRh@q`wCp>%pHj>uz#_?KaN zvN~E(1|D6aJ=0;EaFxGr>o62WW_#){7FUrxeK}Vp`_N&Hh;r5h65<_eS{CzAU&pvx zU+cdj2=mH+RoYUA^`_TN4r&ZEwc`1A0AFH31sEKmtLTy*V(5_7LTo*Ib3wB350 zh9jr8^ibu7y4|PkCltyN_g6OgrUi6H;c74I!_NVXCN+-nGCgNm2{f2Ydl{h4Ky?Rr z>f#A*@{$vuiEt?v3)l_hDq)LOPubUCkVG0t>uGN!Gr>@!f8D0lEgZJ@_3}8FkY)$% z$@m??g9|ALiOp&@V;2^~w%4rCW_p_ir((^I+KO2eV{TaoD_X7yC+5fD>6KykL*>T{ z;Y|Rr7=I|lSq@j-i|odA3i)JXilm3*AF|d(tFOE_uE^fzGDN%1Q3(JYgzgi*e&8T;cgNX=%q|pgX zdb~jxt5~+{=a9xV03R0m;GP;Wdz1?NSlkB~WS4%&XaWzWX%kF5MrE(Iu3epDT_XDT z6lU%_p0cY`Bch%0f<)B9xaDHZyqj%dWwKAjDep?7hgey$s0D-}-iLqfhG3_tSu}}38n|Xu3l*%3Z3S2RiY{vKrc?FykR#pK< z(v4)&&yK%^Li8taZSy-2VzAMExK}16E@~#8#w%i17+%ENM%RQIf~MbOGZLxC%j9h0#4_SRzA=b zAJpJEE^!@@)!D0FK?BQRb}sPD@p6mDy`#$%tOh}%OHWTNAIi7_v77NzGFwo-Of7T5r{Y@q#zHS(Pj z1G>~O4^+T;?Hkw|f8CAq=zvOmhqv)e2b2gojonz%5=}6z-N-R+)Mt;b-(I~C7HWsv z4B*b#;u8n)lE?0O6N(|ulU=y`d2mQrOD+nA>=%fm^>vl4-%!{1xV+iMG;;>?-Je<8 zx12xWX_K{r5a&7XaUB3L3l~!n<__HKqB?CHPT)%dH* zMW;|4SdhWTge)>tfWauj?Xd$tAfsy}d4O0ei;QF<4NJ?qG{_Mka#2Fsp6owX0VAny zr&$XQOVrgByRB6Ha*@UBF60{ZIB!Pl02u{d>0aiDj9`2Unq1-6?n0C>g}JZ8;RQ@d zzkj;erWbPq(677V~~u)75fZc>48F*}FY? z52?51uO5h#7;&}noqiyLP11RZa%fwPUEq&=P*IMP*M|&9B-Y&ry^#uEBx6Ya5mka} zP+2_M;74gr4ADGWT%%!)SfF{zO2o1**Bp>JVdn@8mJGLorpIG$QC(pZ8cx7(UkB6= z6M;GlN526RoI)WQ9Aw5cSCG;WrUPWQO2saM9H=sS1Dea-Sj!T|FW}!(e9FY?C+cN9 z{rid1p7ItDO=2Vl@=|Xe=co`@Efe8|?+qvK?}aOju3Ub$T@dz%Ki8=jNTzT5fN(|J zr}#Aw$K& z8pz7oi>knX^K%neM`pTg5 zh;QQ)5?A6_E`+INqR7tJR`}QOA=TcLJN|t_;WY3Q##bU97|P19MmWmc04H$~TXOw0 z1Rg;^3}sB<2?J^_Tw4~LVKOuxvh~Jr(sskV(m0cxA|`rN4ZclD)5lhy2BJ$e{{@E( z)=+w(%9IW#X=IXlAoQfTKXJD((KL;9@6?T2+GC{X#Dk>+| zjAM~pW6r*EAmSHI4!GTug&us18rUJ`7D4rZiW;qMsnyypE&QA|pY)QPx6++Q|N0M8 z{HtPzKZ><$^5xy06#BQ8W>7<1yWa|@Tbr^T_4J@04CsEVzINvRbt(L_4-g5H^dl;% zE@Y8s0St!p+cNY!H1w-Jsi(3#8)9O>H_R$AbBgyB4%1ON8=zJUO~?xyV*^1styuB^ zSA%6RSKcUf;FhEnCJe^i65{*sG9-ozEMuQIk(Ey;5W(GYIX?CqoSjc@cxM2rEkvhB zT6IcO{Kd4FNVgc>nRAM>b08huz|^c%mX1l)oBuWBV1z@4np6iKK<5D|yv=bV@)bfN8c@Hw-h!gCNdFc&yi5ut{vXh)(H)3fw zsJfF=-Pc*&-)Y;^sT<(g4fo{pV+??N`GF?Q4e{iIE$Z_#`ki&-Z5bf?lqJ5uCA9B) z1+>AH+UXgR)13rZ?~%AQuN`xuKg#<{sNqFT8qxhHQ9lCt7QNrUc)^F^+|3Fg9K5Kv zxJ-k`akYcae5_8;eGoq;RMPOnNq|qTY$19sov`hiU{dh4yQEX!H$B-Bb*-5|R>&A^ zY=7>ve*3f-b4B}CJ9^B9_7>n#WJYUt>zc&@w?G!v!51SZNhX?cn2>Vdl63ubdds@< za8cRJ*gc@3Orn}@{t6>!(bxl^zNILc<^Iv2n?uVZ{DOuS#NYHnU=6xz5^;`&sUeNy z3st$nAa0rRmr_u5-L&UdgH{h3Mc_|-iP%5R;Y-$hB9-eu&Am^D!ACafg|V+ObD{zk z9!0;>o+v$Uj~@UVZ7(Qi)MfozLGd>~PLs*;;_2UGb3EPQ1v$#shW9=>!z_pVM2 zUVT+&LmHAlL-n|2QW)kBLnAISY{+*P>M7(Bs4 z(iUgc{d{?3klk#i8km?>i<=L6-ouUMmfU!?MWLOfWGQv zpk?RKM41?Mkz{BAlwzitF8-{G*}{=Xvcr*&ufYjUBGD64=oxv|>t}y|p6-*Gd%`W^ z{~R?)58z+3IIBlUOKw56(UluKFQSO7%3zzru_<=n5WRCpW-;grWK(3aRm@uw$apa; z{R;k6F|JD%{$-ilE%Zg&xknkeuq`B0JBBjGLj{{09s-yFoZ>?=+}P+d06opaThXMf z98HUDckauyF)m7~lB!ei%>sSJevS@po9(BRaHqyt_9_oEXnAw*ayp}rxCh=kz$xla zB}m*$#%qOQ^Xp60b92T(l?k-{A}u-Tn-u^%csms{kFA!uIGrc%PC;`wbs6Ck&BBg4 zABB4|5+Bc!mqvWGebv?wY+Xfe6F_{$Pdu2lb{XaWwMhFFqQQ&B5x`hFfl zS4RKWAWJ=nM=}VW2?6VYoBkJJ#pmzd>>(Ll#+n~d0`RZrNNb`?e6IVSJ~2hJ2~LO} zXQgIzRryaW7ylXT{m((rLfJsY^f$p1;aig_@(<$)E9EN{88s#R7cv$gQCkjK03~>P z)rMlzMvB76k35H9MzY!WIp{YeFli}1FzIajsf*vDvs9ZVvQ5ji?lts%A2u=;43;f( zx?64-y2U%g5YxJ~I%Sx-)f@+t>6H6XCR6dpyXOcYyPr1wk@AP<$jnhy+LT_jKDBK!^Sa$8tc>n{leJoU ztxg@ab6eX^W3SpVN_u**;50A}SU zIpVx&SJLR%y5z|m%SU_r_C>0K=li?~jAV3!!p}&77s7pUAd!c>u-TBF2N7mPomuK% z$ix+^<8H3a-1Hma8YIL_snZ=M#2!YNpUs1ScX)J39`h9tj^hD=8>FWNp8IsL-i6T{_O?I{ZaIv_JzTYeZr}rpAjmtO#AEyC#x-4X)xs9Z$#^= z5!X6C`pE2&J=Gm2Yk)|dQ_%cYBe?y7R5HQmRLlq?izpm&-TTk~<~NU$n+E+uZ!QE& znaM`~|520C0EJ2yvJ3nuJo6V#R+|u2ZQ=gUes$1cA|Hhj?{>Xrb)krx1Azk*E+LzQ z#*%H7Z83YAJNOdJH^5%x`%}(vBQzr_9pJAJw~RSG-H{Tm2Oy~-%lIQ z)i3!f2MoJ?RsUKq7E*;`ZYfJzjsG#2&rVWC$6k-G zd)n?MAXcQ%vB{tPe!#J`*_;sHNtaFBRA1ZOhd$n-hA>Zmrn+wkw11z8Egza%i6JNg zrV`{h(5EjU$RL$R*)tg4yDu3p3BPSIj^O^`z2m0js1x7;3RTWjk;PEHWFV}>RU3RI zy#;6%5K8>=3cH{Y8Bk}#4H~D7nR>?R{#@F~zs+@JH+=}beg~p}6lcv3FMs~#>2$59 zMqnkJNl4)0VtR7jb~OEbd3xdl>IluonvMP=(GjgF;k47_&lVrLF9T*v;l?HL=Zb!~ zU4ncjRhpq1Fhw$r9p75)&e=b&4kn5;8QGm6Om(DIGHR3+HaK9Spf`KPV4vC|%?&03 z1`Txyb&gB1Qp7=+33e*I@|tmPqgKUA1GbQ1EJ0>zQAMTg2fo=<6ou*6%g{fiHg|Vv zdaoYkHW6urnFbqQS9nnY&rK?CyVhm`g@e(aPh&<6AWk4wFu)r-#yxEtSh8EIfw`*S z*Dmu^AjoRGGn$%W=#SqYe4#kiS}u~-Fvl~rPe?bs=2naJtOr+L?^Y(3sJ3WP_w34X z52h>SY5YAj;@{B0uuhxtw@ao?`qjX-?D|`x>$y^M3-YE|?o<7gwyE^714;#Ao#ZA_ zDVhxe7>)C6qjn3nZiTvp%n*0B^DUY=mx1x`9X`6O20w4$%Hm?>uvd?gSQ2W zH|M#kr3E?DD$8)J_P9_F~WOZZWeeuP`Mq zptqQkxBr;3t0#rB%V551h>bFOUlVnDKQ#Qx?ZWe0_W;2M5ot4fG!;Ji5o()Ss?LO| zL5T*{v_Hz7)ShoI2B``CwqCghBDz{JPf5!-x~q(u;&uTeC&$1MK?rvz;WvR+S>V_a zRD>|7-KtiKTY$IN29D za9rvQH`$LsG%02$y>76at{wR|IW#MqU-{H${JQXWA~WrSZA%)v3R=V#AnYnv5^>^_ z0bAClO<#5`}H2 zAZg%!PMQYz1|)j!J7vV%Zw8rp$gJY(1sj$xL=el1KL&nF(Ey_7eNk>&B%BD`F7i=r zf>>e9;-}}QzeB4lX4t*0*}1kbApTR1Mo8w)3zG{kKdk$N4z1P^vwiMn*v(_{Rp`D3 zRDD{%*RSzOhVagCZ}6WMEpJAz#fL~O$Tb5i}S{>8WU@^(qrjU zDy^Dq8MKTS28AUW!cLLnS&QUZ8sZYRrxw;?x>{gJkfgB;h=afDR%ag>!0cG1IRI=UJ|HL*aOBFnCX>B`B zKh$P!1AN{=t}$TY;V#=+j(ht$LKrXG)$D3Vb}FQ3_F;n+@>h*(H1&1qrJD=UY~y2i z5S;;Ta=#0f;C@uKamOEV!LQxOM`QHJdsjAwYJ|s#`V+~mGu}6b?$_eOaL7>To`*=j z{4udI&b=VH3<|sClXGzuX{c!%lAqnXbFq~Jt&RA(ut8Pz7F;sVPMiAe1bHP)4~LRl z7uk690vR@idGv7nE77#%tNZijlMj~DRA?Ch&D^A)xDxkca-W1Kyc$_WH!?rfNbc9w z0N&St_uxa%bW^8(p23Dkg8+U3saXpFRwQxThUPG8(Y01YC1zYi*H z5r)dNjEygRd1|k5e0~o{alca?0!+QB#rU;P{A72#``P zGzegt4e5}rVgJ|i;Ggci0hOv@i3|kfPW3;SPEUh?9#E(bsi$<<_&GHxZNupJLp_zB zfB{0F4#^0T1(-PyXf_rIQdoXqbV3FrZDK%OZDXcwUt#bY6;f*CC#wid5>eVXmups9 zKk(?Ln0i-hcvnw9HJJV0;&|FhBOwtIBt7W<^6C0I|H@wO^1j6csy}Hih1ga8+2=Ot zC;P4t{{Ogo2ky+GZd*5I#kOtRwr$(yn^bJuwr$(CT`?+7>gL;L-*ejDzhSjG*Op!tbfZIOkXO`_>AFS7) zADX;HKWCVk z+Et~R-AFR38qU@co1%@k7KAfkLNPpt?9}-0$mF|qTbLFx=rSfLGP^41DW)RyYn#B| zg-$&B0UMYSiBR#zx{299wPxn0#WA+-V$9+84xeqcZ*H3V zE$mod8ANT`yr1Na1PZ)Rmp?3;#kV$}6g$W^E8ictvvyAWJ@R|Hy-X5y2kL}SXkHUaR3wTjFBFXU|8`K#{F!i51}XI8dW{J@%Zo>WLFBF-HP=? z80=m=v&8dPm-9gjyW)&;+OHQs{ z)vOIgANl;JPPj9FFT_h29HMw0g?aa54T8X793jJPRVWpqH3O83)Yi+Clf-A5wTG6P z#Y@m*W{X>>YnIMwxpj*Ey2gs*IQB`OSs$0GL*yrfbz@&FmmZi~TaaSg4fDtNwo4X0 zn%X9@ek~U$1^m8x{Pq3#_6PgOdCd{6R=q-{=+VqMd=MMQH93B-?#0c&Z};Z82{Ps! zG~2AV#A7@CDi$F66gxX^+9p7%oVk7Q{Kt842HS3ce{gu%x}pFU!TOcyX2FuiZs{DP zQ?V%O+&G55;2PJUSHzQwQ%g{{a?uRiFOOd10w$)mxQewiv-T~PXD;!FL9v9?!#KJ! zq!^gx_qUwNhG2B?{TEp(IgVjzfcp2X$2;6(&J6} z9%Em!#oDQN`W5eAyg-liYL8A(i=?$T08XFW%MPaQ$d2x>QsyNT)35u`s z0RHg$*#!`Tk764)1^=>ug6$?#BSE@Jg6dPDP()GU6_C4lZdJi20;%S$UUXJ`-;K&J zAJuq{f&C6Pf`#29%3!np8Q9>9khx!;w^E%oW`RhW*v@ z+ZEOqt`_RAcQ=lgjZBT2S~K$%1gxWe=B|3nr{Ti`N}?znIxJK5wKa}bTTOMnK2s4n zKNG;xAGMaTNS9OQ-S$t;21irdH4>&u7vwW(^pHYeSxZ~KIK13#@u$ZkdjSi$+QEXM z!Ch7a7aCQYQP1A1Y~En$^#F7db&T_9@l1AclHL7O!E1B9L4RpI5fv9V5x7UAXT@Za z8jIu&yWaTT%$}l!1>A?0wo9T366#P9zDxjYn2XE&S&T)QO4w3x5wo1|!1zUZ!CY_s zF|T>NlXSmc0c1C>2q#IRi>AypYzp>bM&ECvPbCw!fmr!I{DqL4^4MfDoMAtq7@p1E zh3SGYxde$OlW(Xovf{82Chu+FxSN+O3itCsN7mvjb}sDHnoAF0iaAp_8_rsvdrH7D zyJX9ZqrJYe-~E)b0MN70z!5Ox!<%>@qqu)+ya7P>7-jo764~H>v}vsz>ltRE4Z1`0 zkFn|B0YeI&t^?INcJ|q<94}nMFfRj1sJxLRi)gX8QuW!2Y6@%^rVZ!7?#w2yUQgP( zs=7Lx${H(M&F$eyZNT(fw43o^Qaykhj9jJiRODgr&CLvRuf8(#4~3&L~ftJ-Y|tqLKN%vgmXyNb>NFDgltcF|v^0 zgr%S{lf5Zec42UyxBT@{m6pz z29eM|Bx8RZ`^KR^Z^}>aSjbAaIE+27fOTDPXL7YT|CwNf?1p>IZ?SX8q z<4(UMlT7@|H_CYEV>sDZLL@*6OfM?ojo}OCy-$vS3TvOh0>goNniwx!(LoZU# z?hV&1POshj>O=}N=uD4;z6P`%2&@aZvcuGT!AHXA2Dz}P-4KDkPAbBO8zEhAQgNE^8z_^ z=;UR87{~nHiIov*kG65~${jSYaGF5LKTO1@{AjP(|Ij5D`5pzd0H?Y9L||sOgJ@tM zX&hMFMCm~=<(IxX#n)g+(J5bq+F_Vqhwa#s-iB?)B-Nc~Uzd{-peO7FB-rUmnJMKV~D4*P4 zI`)7+ve|FEb+rSY$d1$8O|Ixo(J1%=pAr}OO))u@+j*KwisPsXONy%zj@q}(w%{Z- zTpX`|i@YY;ZDloc#JWHy5WFushB% zISo58v^vUMLu^}STQm6wWTl5L+nc{_M5~Yuu}`oo4L1T%+S1PoUphE4#`ul8k0MGA zXz4FUgLmq$QC44w&&Z1L`iEOGlDy-6=20c|Lu%TOwXzi_`}oH9LYfbm(`q1-x*SWV zDKAGNLNR5$nMM*VoH*Y%#eoDyBrbHE`P?P}^zNYlP1ztVTZgn7J`mX+OsMr@*d z`nPG>(scj^R#OdpVOU*^FF@wid;t$FeCZh`m!lIq=_y=UQHl1`7o*$ws;ZkVSIn$+ zID1nK8k?E|@>Ej|e+v>{HpeLDhV|MZ%~DZU8|VY*B_Q+yWji4{T2YlYR1a}kPl6Be=%il(U$IGE{P@_eNZcZ}2%27!-5Sj+K;XZw6KlSY+xGfmJNtw73io;t7R7(*H zJusJV^A~(;2$Q-KAE2>*(3T`}Lwk+b)npx9G2-Q?CvR5V@ufyM%AS43j z8cZN{ma&_$4Xg-^d!==HdG1>8`GV_W>ZqD#s)zCg2;;tkec$8#cJr8m_y=X*ab3<~ z)dv`q6vFC5zkjRW*c|oB-*g3kxX+KZ$MO%zztiLvE8O$?g<@PdcxIjTOg;L~J@TJ; zg|&at`3X@yk(n(KWeWcb|5&&vZ%hWxr?~Q9wPrdwj`=AeCC8eXi zxV0$LGBAGPXjI|QdyY&^4?BhK(cFkqGsk6d>zQbsH>;{Y8{x^+d+te@0Nv!8fW(rg z--cpNCYVp`+j*NW~fFO&F_Nszkpz!Po49&+xuuZ|O%#ffo9< zaw3~?FD47mLPy5eBoiu7;Snx<0yCQ_B=dzo`16`8eFtzP?(YpF+h_s$M>4u(=S*Ro z?dUNsy`5GE>1AmWMmKge4Xm2XkJm}bb4f-*^|QMeZ|yl{oF8YeL%Yc82(D4x2NctL zq`@gP9~srSz*&-|Ti@TxRnQGfoGSx;iFA5iSI4+2$(+bp@D=j65XDqi^*MsTCG|EoOZpqh_ zQ5){o8}6x%)+=!PF1t#tNBa&2(W=ViN6Eg^4;K@E(F0F#DfogR?7hk0ys&DGZw|A& z;`oqP)tzboDwpt85OY-s&onquuha@ABBl!dz-h5PkT^8TdKCZxm3YZSZo9V=>=U1-`JORj+HjVk5aEzy-W=;SqGbbG>vFrVqE`lk6xR7HYIMnyt{KuI62APAn-|^WGW^+1*&2mzF z)BdQF&h8*^k{Z}d`dS0(4ah3VYFAL|Cb^BFMV}d0h_j>0W_;MmF7@IY{qh4d@C9gi zk&ro&v+xCQX_VLPviAqvC%oI0uKVz0;e66i2vkZ}YOR2MBr}@M6g$px-EfSQsJlvM zCVdU}L(mg+-*VeAiOG^z-Hu-XjatI8#w2p8wt3X=*#n0Z=dJ=FjCy#secV{owuX@E z1A>JkRoZ>pL!dQP-&kDU5qolQ0;fn)CQ*B$hGmM7(|s%6q0UtK67ktu$5B2w$a`8B z(zu5hoHPL3j^AE-Lb&AVh!526v$+%-| zMA!cym1*tOs7BaLR6s3>YMVEG{Vx$% z=Zlhq@kj1MCTu%UL~;3lG4%gY^hDt&#M6G#n$wa0D={L;5eDKvkOC@z-o)0(#ic~! z!vp68sfVVnxv|^d5a%=eI(?Y5^-5G;*lNHEnPe=Y{0Nl?nv;$W$LiXa*al6CU5bD{ zj$M&bQJa!&ei2>zJ)f>wN_U*g?%n2J(YK(&ZMAw;3o)0|J=Z&a7mLTuGzZJx``*8= zCjy}7!y>2~k<#2Cx++@$7>}b+D;L%SGpea(V%roFZ%7oev(!+V>31vdcWmhGWH<6p zc_u|wnVF~fP!pUd{9ar>p1`~#*Kc@U1_k~2H38HM3^PwE5Ilj!J7+LIPqEz|>Y+F@ zPq`rl;`P`(Yfrr)9GK0~xno!^5-rZ`mZgiNjBX|e>Uorm=!_^pS&Z-QG)(}AoAKvx z`)@myRJ^J5kiinohiah$S6cn-xD0R-Gt_7%@PlltV)CWY-ymcKgq(9^O2W;?bSQdU zHH3_LhlWm2*KN$|2S6tfC=mrJtY~d2$=11z%%@L_hgd8ggPcjHNvl*mR>cZfTr$r$ zA}x-q#ILnF5gCU7CEFYTy@s>u8J_=F5E~x045>V9j^gTgM#k^oH=Bh|8~v;hOYXhlfh8r2(p?Or6(-~3j1Gow$&gQxFFG$bX z4Yp8@v;#(~^0^$aH$EVLtRm7V>dLO5Y4Vz_*rhyNX$aZ?7){~>&WG(S(xmVVOZQY; zv#}8p)|oWmd^i(Ky6WGatJCo}wgZy60_LVWLCBBhv%2*U;4EeNL}miha^|5OgJ~1Z zR>#>a(uy3-$K;2v=CN-1()4jwo=G7hK3+|)pRdR{4zyb?&+mmfji(G;v5cw-$$Upl zJ6cgeMK>>i9)1&kHR=M-7Lh$t4|Ji2>I_~1lhf;`MkVetIQX3kf*>5OGPq;bPhBCE z3G;}@Uh8Zb;S^E6*qv|Q>gj>-1X*V`MsDs(!)EDNJH-+aTl~PNBC~kDe+W=N7(||I zmmE2>4Z}&|X)#&DRb^>|j_(3fSbHqe)nWsJ33D~z&pOH04)ZW$B}t?ao`IO|kPi3m zC=WNe(DKcu)0z`%X>1shhT|TdSxT(Iej4}g2p3-8pb%b@r^3L%T!t1c4Bjp5wnNBd z?M(l5f}wBz5sZJCi8iA@!|^xa5P_58faC(exYP1&eL{9t%82CzV$jA8WKc+Mfvw!4vZ7++N7M?B|N2%GlM;&I@VuJDJXm=&m^Re+{ zvqNP_H*EBjD-W9W({f0icv7p{ce~c2M*=qbU})iFDLI()RXc3+3;M9`r}==OIf@c4 z>I-a=X0WZ57VxM_7PLGSW9d-Mhs3i_a)k#tn^Pqv>|TrqN5*@5KeH>Cz|&LPy`ed7Kq(D4S-s9BWatXkybRFDKc@Riht+4tq1+#cEE-=4dz zVQ~D52BtLD!Cz^6QK2KUGqw$O2Q&s{VF+ZD`A)3yB_`wxjlk{r7ry?m8vl@bA1Dsc z(Vs?zhgx%fhrMh$#|Bo^vxXQxt0z|ea$y4{cB@_|M6-2S%F<8R5^BjaSvPHzh&P~a z9QE}P<(d2Ce>Ikd_wfav6wriB?lvpEt?~8^1mBr$oGr$W*#mPeGUqt%)jq~lhykuk z0#n3sLw)O>veHNVsT6Vp%CEPwqE-R`SCMwjJEnc&E^>3_^3FNvjokmX3{cv5@DQaA zVibpf#9S4zEc{|8c0-i0-BuZPvSVdZ91%%(q^0JZCh*Cg@~WHS!qpQQk~>f7j(hbC zZZ?Xgr`xgQ@oowPc ziISU_i6?x+bHSALp(30XEs}yKyrXCR3$x5UQ1y7=HzQFsF~W002=OFBYt)gThe6;B z?AE#Nj53pbQ~C5H#oB)-^hb@?Z&}3mx2kAm9ID7CxcaVemkN8M6SW20mx-}@d z(wP?gCpf0-Y6_Q=mrv8L)45WF;prX%Hg)XI7!@dHIUXNB1E6Ul^$fHt>A%t}m}W73 z$X+vay>eBk$q5mNLXiie@RM&A{Q3ooEpN^Fmw**KlkzS7Y|O;|j++eNDI|VFAEsTe zzD}RC_gGzzp=reMKDgS!Z;QwJ&~9<;v?i&sFkX2Hn6jW@tL~PisY5(eJM2AeT5Q>s zrpU>8td{M{SQ#}r*EbvWhHfp1-aF3Tyo|oZY5rS^&}GNhipX_+vQA5VoKKOC@{VhLNd5Zb|4S!_pV~JvrKZvf8`IOrJNamVDd8a#Ez0(zX-f zoSxF5cmfZj`rPn$(n8M+_RL<%J?V;llDFhhpC69XsdO05Ht$G6P2i3r7+mDu=n0YO zdY}G*9HRB!bj$1C?eT_t{;Nl*SkCeH+AE4bO69-*6%bk@uii5LWBNw^!4Au?QeJ2rdn`};o1UD@8o}1y~oy+24?*F;H34RClQdNE^{>Dfk zf;pI+lBI6Hv2RD?fxGSIs9;zOsOoIE5P$psNECE(w-?J_js_)Dv!MPA zBqWAr{VjP`OSVg;sOXJQIjTA<*qK`1b9%fzhP*fgq3^^Dy)*_p(_5~V)!swXbz`Kc ze*)mR%_Dl=LH_i?cWaz%(`R=y_fKC)9}pSHq##s|$Bl*IT?v}oWV9f;Lw1|b@@fm| z*xL&G9ux=2EK8s2j$y6<_}+ojn1pC-aUPG?f;TjKm_i33q+<>tgpy&bW*xM1Hu^O< z*U9a|-nxqYc*N@v&b#xncfT>dw$Fh5P|5z_Uwjnf#eaW+IRmdT_r%`Qmi3Fvv2YK# z&lsZLF#J#7KcPcHc->~uRF)Jm`P$@kHX#%d(I}xn zT2V>S-CXl2Q!K)i%>yoeHO4o`kYS?G7W~<}LufZWg7{H{=6eJtz3sL8DYSg!9&>Ip zKEB4%>VU|Zu*6|QiJ?q5eK4Q(RV3p-zn~P=Co3!Vv*X2_>^g8%@N^Mf@HJU>> z$V~Rw@UpfAr383iNqReU-1MhXqr(7yAJK&MvqqTLrljl4*K41&IdprTjMesDPHnfv z2pbP@)n!HtsZ>aIZBZJ-BB2VY=?|Qt+SFtPRTd~l@QT5>|1q69oNqXSG(_DHI$rQv z)wEkA>jw7zGd*@&t8Oq}b~&pIyLm% zuzNFEzflno@q2c=Pv(b}9wgatWMH?5f=L3HwFEOScFKQq(H8v4EpZ=^U$>!Mu|pHpkl6O9}KJr zh^}f-sndB|eS|(t*YP;SZbJYV0}X|%(BNAABHA7Sm0idi;Z4nag$ctwQb_g21Gh!m z6T(9KgI4X`zNhnvR|VXoOFKI4U+WVDiD?*vO}&G0ds5uh(g&4@s&MvQKh-xrXcveB0P;Ui!Z|eXqV&&2nD_I> z5di{9Yx?+U-?6hsfd=UOhrj+VZ3}TvP)1YiR;}2CRqTfqR#K&nOpR(Sd~LOr(Av0R z-=do&U>dOW{izN!yia^R5Beu{lyNN{QKBr8#K*$-nDfEK@`J#9!x*AYU7ruu6Osst zGH%A=XCwUFB+~7qMzm1SMRx79t4>1XU=v_S{iaYFj%<=30F~dmNsfAhaL`M?^e!Xu zn>;6)-~Jje9HzjCINW43))vFrmpzttj@rGD4k6ZSv`E{E4$2|Vq{`{lk>F#Zoj_Z} zTfhbBEOjbZI4-)9m1PLW^(3fkpm8rQ=|Yuwgv+lX7{hG_cSz05Use5zJN#H&rp+Hl z4szI}O+3rt0?h0`t}Mc|!AwTV|K#7RqWMWRu-@;Py^Dfi_A|B+#2J&I=B!m>iyjR| zfmTXMuIM*UC#n;Plwq%QZR$c%-Bn4e876fZUjBj6j>uBu`4B!a(_w)_{xiN6*~wm( zoD)uJTH%NJ+pEdC!dDzc=$SQ?k(60dYZANCUY+&m0)X45F;f_gwVk*SQ^X8^P#?`d zY`Q&K9n8agLp+A)u)@)JnJlFdU3SrJmym#?Cdc3$Rj?(8Fi^-ofmTGyg_Ob+<|Tw~ zN_&{g2*@K&Opp*71*M(v43}6A`=CY>d5trHrI{N?_!BEo{h>Bg?jd1L;EpMOqvQlJ zAqOf#1law_i+p(bL$MJ0_YL1%vSoK?StTNMVA(3NGEtx*!HAjVAAw7bR5K$oaEb1z zc!JTq+=t|#MB2=!#e%6?|FVX z#Kg@f-{tgvThhXk@eY)V`wFDsjI;X!e+RYzG+gqEOku?k#m6o6Wfh*)NWi2q!}E&E z#xg-yPxs0{nD_C!{{cgCYRfXJc@43cL;*&f$a_&l6PG+4H3lvE{82R z#N4gUqzA{Jxj6#SCj`tVhUpnX>v{E_T)XYu8$}qx!ZGzzDqi9Yk>Vc;eBKwLhLN&x zBp5_?KLnF#Rb1{gYwSF|a5uiUlMhnqG*_R&|2%bek6UzeKS)tCP1{fB2|WD&$RqEl zJ>7Eu(Iav(e(JLRYb^pGZ{%v_ZuWnMk{S(2Puvl-Z;j3_z8v*bS|VGl4#QtuQkY6H zK~NEDzbNwP#1idnL5wYo6NhrJRA?UBr4vFnD0klIBLS6p!-&=O{ft_m4 z(lcG0GOo2-3UJ+Q(A5Y^7(e;hr?u&<9XV+f{TI6w)@J|b_Vxn*)OX17pWxi-@EbPu zv#a&I&-+K>#4tOYwy=m?T8;}J%h@$!6L?jkq$PHtaV2>*FrVo3L#mpLyL8y|c@8qLmY}pfq(MDcKa7Ol>UJ)$<(|{>fNTkU>vhoUb8L z!%)Vm38;-7t5Bo!anAjDrRo;^&ho0?hUb7a8l$X$>NyDEp#j>Rd%CRWl!e)cja$q5YsAei$TG*mV78~v*(iy6N6)s*+ zUBj20fQMErpORlPwqs6eYDFU#r?nWzMdDwk09+?$>=r!7v}8J5>zfvmv{!DoIPd=8(f#w+(n;R#KqG3ZOJ zpZ26Hgr3MA>;w=^ zSImE7l+rn+rWM;7k6g@jTa$%$^a~+A*zN&mu)Cd$kVNkCfbEOJZt4c6F+&0sXnTiEwHiV*B)%UY0a`KtRAaT_+OHdN(MKf_j;h_5&1`G(TqY1g9{wOMTI3soN(dnqz|4m&8!RW48KE4W-FGJm7O%Q0Uwb zVb{ixLi<;C96M-I`?Me~9k;*He%fnF;FMEH=(B|<$lzez$Q=$-ci#1|y8<%M#cNIA z-oXp^x8Z)=D@p^?oyF%!zkyR%H;7A!%&$*40L5pMBzdEj&Ghuc=wr2D`P94fMg^Na z5re%bP0#3Tjnq5LO~1fvDIkHq?gf|S3?||)*TtFlMOSD_6hz5U9>jMDg&VKgzSZZC zW>YQTNAj_L=(-EadA8Bx=^CT3A~*LQn|YLz=OO#-d@`(x3rj2POhrhvkw|l#m8fH zdlrYJ!rNwH3uZRC3FX909LpG8{M6leyho_~CuwZ>rVcfw{VgND@6&rcNI%Pt6GE1PSjj=k*HoE_o1y;m|N=AeUNOQ28+Bgn>=QKbhiWT%x?IS_{?zLqpMwKvo) znj^Kg1`09$E*`>dyOEr6FkRcH=Hg!43`Ci6`~tA>i56OBLOnJnk^rDTR&*)p$7Ik@ zhkjlofc$e&S?sP5bNjD7qxs+s8fo3GL@d@c7c_nPtVaV= z3+1c-95+h;YJh=XK@;&Ps`cMsP2CGA714Bp8nd;kao`V5;V3$VQopV=@WZshFBfP9 zwkdPkW?kLUTI|akn(Bs=;s@reM z#%T2H*!^F-8u8F1!AZyuLg9G`L*vE(No6=1P8@O6GvZgMGqmV&H&uUn$v+K@qxVkf z!5C<|Fh|U_lwbJsFd7 zR;3jfD&7;+=qf=EJcU~>oqWb8=B^xiLN5t#=|AJt6q`Q#R7Z710#IImg|&_&h2>q}96Mm)PjFze97YgeUr>A`7pyFcYb8M)M4 zQK(!RhOD_ctEa3~oN7ea<7aj|PVd%(YZ*!_9<#0Ha1t-VO1IS~NR}03a`^{bi(g>J zxk(iDmnGC#v<&E2kKMH=4lu8PqeU1Y$ToFW47R3t?3~7$OXhdeb!8(qWShq z>!i?1PZS=tW)oqU1TeQ3WLt`TX0UwvJ7Us(%cBRsDb{hXbM=TJ5s( zXm;dfd%=EbbViHXk_$VEgNVBXkl6$zW{6_&+b;-OXISv~wvOta_ z9LHa^`%>HLI5db%(`*#(lxJ>Z;>c?rSq_PI*i}fyM(#tnIlrvAHW0I`?`0`;xQ$)V zvzKPNjnIp)+0g!)nMxKVh1O^gIY&a_>f^LDp)BF1Gr(+Ac5M9vkWt&sq(*kq*oYeE zve|3XV3b&NJJn+o(Q|!NwW3K+9QnUf02Uht89xiKn%l!-=PhG3I>AjqJk2+uP~Mz zIId5^5#KK212IZ5wO-5+Kfx@xocFUBB-V5!etReE9qR8FfN4(;48xJ|01yy*%v^{; z#{7&JBjXt}N^fZ6K-dv%9(Zp`!{@07^6%RVc;KM6fZF($A)NF@-7)bCsg>S%i}(3{ zo-vLuLd@1c(8pm%+f)R+LekV`C&}lj2jk2MSZ+PYYTEmfqg|x$X1})Wy{BC6PL47N zX9!LF4|N4AfM0~-j^3e1AJq|8C7DG=3gU=6NWrrP&9g-A2)h8?gY4UOSCF0|m)UK5 z(4$=ruFWy;lDYS}abYe!wkV+yVZQaNIy~s}W8(JFkQp+rs$)|QI?M|A*4j6UWcb}N z`HsH4p$}1czAFD#fi*%#_n)Dug7aUti6xb05M2O;>J&Pzjuf>TbRAS?=0an*x;S-x zK)^ppu(h=URW(S1FKBtm?z4gqE9i_484Hw_G?%m;-c0?WZn1tCWi z^Ud&*%9TAG;a~|=q)XLaHrCM*||N|&jiui zV%%LbZ~qyw^9-wYr)<{?@PMgTS?`{T;<>YDa6ga-zDhVNyr)eJxitwy6+@(;x zeK7`p_H<;pNjmVy!jCtq(`{2wN0_{ehx}Ne8-g@F3fPD5Y(OGNUKtuZLF%{^f#JV8 zcq742J}lDr{Y3ysE072k!RL)s7+=X#y-SCTJ5qt+ui0k-t3!`SFR*F0-tHD@$+>{fQqWWcRuiDLeu+2CJYqM~yYRE_?ZUo(YB#%Ta@&kLymczKS zriXeCMG6lfG$nDbf%=N;pAv-fJ}jnx?ppkyOw(gO*LAI^US7R=ELejLW~VDEpkho$|FXlHnjZ(&FAso(4--aYW-TJCd=t z(wHBlIxMp8;1Z^{;4sTme?*v8`JT>KXTU?%7lWa`48E~KzN|ufikU9KHz*R_S7GGk zzA%ztKg<>ZjpI;)+CLgYwL3Vk{Iw!LU}z4Y_9?91H(ZDMsXgKV_FD6+?*}0N6gvMG zKI8nUK>Z!vSN=+ajzo`lLA7QH5=r+>PW+XVCpIE*r-1ekdEq-I4ee86gvNQGYF&^L zCq#zEQ*Hz>0#CD>i7T#|7^39nLThhT(C)`RV+qAPQ@}{l>dR^truYSbWKSzm3c&&# z93~J)F;dBRB4|u9Yt71^*4B4ShdVR%FxoUAHrm1`L@;2CDrVttHmb*EB+Qz^WuFq% zN{_?g&&*Daq@<_?uP&?{8+joZy(Vd$m_iCL)k7a&Y@kT)N7$ImEg)ohkJ%dZH7VHy8-Y zNt3kydY1N+B%2$SZ%W|K5 z)ur1XbB=}hg7%3zGSuVQnd+=Ch|VKYLR1z?9>_wMTt)`0?%M!32G#PSZ!Q6xgcjw? zMb#WXPyfLlcX+!NF(R)%$`a8ILuWqR7KmwC@1|L|fROzCZK%h{Nxe3)$$lcELJFT{ z9W;uibdyl1ZJJ_4&O>3(@Hr58$JbRsJsps$J{FDjvyHjJx(Rnv^RQ@*$o>|D)zPEI zO_hqjz$OK6@~WJ}qS)TKBP$BfiX;X&wrd>ja+zvp&u7byajnq69b)rgvlr@Wm%hq0 zwk=;aagWz;xD{9Pw~o|5B@ZqtqMYVsIH+^%O&d@Tk!1~Frn{n7VK?=V6h^sVOv+!k z#_tk2s27oGZ>_6q#Bw*l?Xr0+Tg5b0B2~!`&lIOxhv&^#%K1yxV?hAO8U%hrqYQaR zm%t;iMt{;FD-0`6^QT$6aq-qy9Sm7;oxx1pH2 zL<(&6Sr%M>xWN!+X*-qiuYTXFwN|6n*cauhSyQ8|I zaUb=udy5f&qjO@rIW#4~*Lp%LTVSwvMS=St*ERMvN1MVTup5Zpq`BH2PNEBHi|+KecofwO0XgPQm`s6t=ovzrZCF*JG%pI$__L0_Wjwp=Gx{ag*f97m_rT`n6^u z{hS>mL4nKWHlkq9&L&lx2~yIk$+L%=|jCHUDDu50rH2Z&-;l1AJbn>6MhQTduRM!>0kNqagRYKj~1s@&$M^6{^WsPpPo7CLVB9QTW`a5q zcyhU=3~NmfHZazQmsffX>l?9oxy~vCXzE3TPbyy`dqb7 zz3oX3DO%oWCI`dN-|XPx3zv$h+n=GnJ`M$IOe#XApH{uh8bUsa!EIh~Gcgd~;|`oN z6Egt6=TbcBeyiRouT%W9QMu;~V$aaSFs?xb0yzodGTp|AF^s}Wj5Ie9r|15RM=+SV zneIYedfYdeHyO~>ff!znhLJO(z#;jwfB$O|jD0JK z?EIlvtbWW}rvE}1(l+W*5dKqlOAV-{)zL-;7I>?KMs;1`P(G3YjgV>?X20Xzkw5Qe zT)LVy{L~`Pk3jfIEJ(heZG{$R9VGX;oy~EX%VuHmd3ziK58&|R58?4V99lv&H`?Bcf+HT z6sdL}nXHkH4a#@=ZRu2$_>IkL^@;5P{@Px#Bx{=s9#+{^j7WGaVpzq!psC%o$PKRW zE0ho@M3U9z0smU?F_zYew8+SxjLN#K>?4;L`LP}^^@Z2j=;elMpJ-@x9X!2;6}Y6f z7b2K5mcs~w@iK)1R-kOkB>+%Ncn9>Q#G>hCJv||)p_vwOXlr3kWdKrSnbkV!yzEtz zOB@b!v-FA3S@>y-9VhqW@P@x>E+3DK-x2F>t0jdIW}V??o9{p&+A|;Elu2Hl)!^PF zs+R7dy{%Td#kzL3xj}5Lvr3k}68ARn)yhw-hCbydcGDtEQCzP{elh`X&~i!h{+es-?+klL?#Agu zea2yq13FotA^~3@f=N$vyI4t#BL~XC~^>&0X{97A-+24mQ1p4??$MO902W&7rtA$L&JKF6l9^bBO^-T zPDNLdR06lw7}O#bDu$!^EF z7&?feO9V^&kX%(`zTL|x!=x9!#$@l_sUA9f$(p$6P<|3n%H7G6D0Ym9c{jCQ9vOaEDAe$ zODEKr=+-E5>Q8bhC=P;B=}z|A@dCwVad-E{-Cc@9 zac`00+HX0}`<>_X_kHcml}s|pCX<=(4xN|hIx_kj)M1P4fTut3tD(q3u6y0M{&AJ3 zEbm##_mkD2(uJU?6ki>X9JP+-C+14h8F6n=-|aM_JLY*~(zJ1CQj5@vD0j>_WPRZ| zRE_%>Ao1vq$*;`)K2SV_N$Qsr>lS0RglQ{5k}UiAS9{YYUt}-DT_#ozV)OLx-#IvC zYa2ZfHK9tdwxlBp&txG53Z2BV7}Q8`TCxY~5#x#E#rQZB*K+~NFun;2mgDi(M6e`$ zz5x(_|93n~t|>?XdkkHux7wkSz%vtaIAD7Q76ZUr0w8+(@5k0(DzDA9Bm4r)F=5q7fbO+wn}chnfN$F2-z>nn1LmW z!xlhOBSCPhOTvI^xCAc3e$l2V*Lv5gR9$%37i;*GhTcky+k%^w{ zjiPzD2Wt0>tD=G@s^9@Zq;W`o%-2k&-+F+HA(H;N?m>1%`5Kc!&74>g6%>B z1>CB_Cj}ZQVxt1ps1aa66+ zL76#N>HnhNMB8jU50iq+T@ui~dk2nI{s)Z=d^H8vL66GAB1ijg@{%{%$fO7vX@}_h2={{q=(`|Asa-u=+jde+b5pVCny@9uYAka1`8xYN)rT9F%X; zP(kA3SaW~3V-M{F%K$7W>;D9On8dR9TM&}U?fDB>(3k(~3!E7&*uN2=d~9z@unb>l z5V*IrA^&T`w{BpYc5CYc_p=iC9Ou7QfdT#ajy3ytpIfKQ)71W>=l>JN0U@tq)&EVn zCg3)?7YvL1KRT%ESYv-9o_4a&Hw#_ zlHz0ZtKyWMz9x&I6 zoEA8^i`DwyM!%ta$w=3;!4!DFQU$?75gUk(jg1Q=vL?p@?d@UZ{;U5D4N)XxJPIBu zpOJxRzTmR$7eBEGK&uB>D=>cvmHvQEybT`T{0#rh25b-*2#NmJxF}t9d42?&A_x|U zfkf~hdYB-I7c3;GzeE*F?EZ)Z^Sb~;h5yU1DF-|6Z)SZbRz*wT3l4c^Ae%kTKg@um zIM^tl0!Zv-B%J@BIOxsLPtE#l5#XL_2Iit-cm9{vTLXI=RHcZ)V_*gm821${2HY7q zpc*u6YUsaMiAdDzD}q@$fLXD=u>ygCAOB_arlskpJQO_mJ0t8rGX>oL_@HSVZ1lfJ zodwp=OC4BL1z79bsKb6U6efrjAG`Hmd2iGxEHn#H!18vXfa<&8!SZG&kRTy8&A;;A zV5C%cjd5Vu4A@NX|0D0sNWkKcaEJP5-d=B4s3of1vtw?2KCTkNB-;d-emL&x$JF&iD5y5T==j#|7HF5G3Fj3u^IeP7Tjm_ zz`6iD9MF~k_SD~G?N+`e+k#m<{l{P60aYEz2|+Nz*dPC8@z!50RfLnrU|HhOZv%%1 zG$xAu`)_akzN>+_0gMm?xBMRqiHG7K0CAki(Lfjy*iHYceUlekaijK zq_Hdi)%eD~Yt`_z4~*c1|IfMt5|_hX{u=?(Nm(@oBYr}IL=~}<|86{D--CP+n2Imh zO{x4d_EfO<{+%^%D(+@YVv)g^K(MD4|4#=2F9OJMfQ~NY1aC>yH0Qw?Obrzvi^O3h zq}0{o<{%-klhDL!d%h{b6u}J6hI4O7vQuX%Bi=Xos}W~i!rd1TpBLw8(a&8{jBd0a zW{P;7s>2Y-qQGFGUGJ{Oy1~V*XS623c3$#;qr=~^ zo1b+!^UdM50O*1oo$R6nmay8kty=iED7B}iuxxr8mCq60*E`LP;J)YI-xGN6x7zq% zU?(;#tuw8kbSx(n=Hz(Xm$XYxkTQfX2=tL)(+^xP{&fPA{;i8#JHFmyX&>64bbiPT zg`>RWQZ1FVY-(WM?=i4izpb;N>hQK@doo8Cwb2B@2C(VTYO3Gg)lN0eKWwcQWkuZI zQ>3w1XqLQgjQLGbf5F9e^#Z>>kSpJwVEBHdbI{+!Whtwh-8A-Gr}vH|7LGV9JLn-bX^Z!a-wXPUM_yK~JqRJ&%y#t5a!Kk7BM*_?|7_MXY9OzMK4Tq>-tWydW+@MxZZL)A0WytlNX~0=6|(K@h&p;;Kq%R6 z3e6yShLexIEY;&gv)a2|(H&F;b0%SaOl@|_&;SSfpVK8eDHpmYXHqiqT@kL~I%cL^IZZMgr>Vy=ore!NrXUv~awl{_=Gln4Zf5D{pv{CLM^g%Q8SS6+mM%TI+AiVw zab)rq;1X>w2-m;}x34@m0#B!`KhGiqc z{JIw(7tXZTqTw=f%|asM57VyG3R)C4O<4N)EMT(+@blR|DDVBkIOyB{pLeHkljnWr zirENwDJdZZuU|~ zpf|^s{?{+O!6ZFx-O1kk4CLEB2oFe3h64{&_6Mh{1J_ie`xpD>Lv{k4H|D|9R}bZ% zRS1lQ1O9LY?WEDw$Ij^Bh*Xxh1)Kwk2$<^z-av@CkrRP@Y_VPcUUm87 zG8kBp!JdT@1YW=$k^gE*Wv(t31(;&n|Lqvw)Pj0Ku_gay_tuhkyB`tA!QM#+8VL5= z|7i&v(B7S#81x|=oAPf@hI9!%oe3664*kz21T2ye*h7qi3_6U!&i+^KTdRpiC1bn5 zSWl>b<))-#V*}5SaS%a=QP^F7UIXFy;(ITQc0%)HV45B{x49SAB0yY+8Ft&Vhb zy#w?94gI!xA#G0oU$Soms!uCzOR&LSlk+bEa6rdQYyyDR!h#rG+C;{LFgY|NG(2(; zx}+pJhpirW;8zUHI4SlIgTPTm{48*)z#zT$mhU0ho%v~C`!vjse_S*2PLRZBCyPuaX zU6npOx4w4Vr@uLr(zhWwAV*rrb7bA}Vr4IFqoX>wRWUM$eSFGeOD^j;1&re+;*K?XMdpVAR>F!h`=V_LO#Z?dOr4F9hjQ+j z-0sqGyH?;5d0FJ}<(Ay0UYVtr@{rmr^GF?yU-2G&FxXOB6L~}j6{%WjbL@R1fIzpb zaMk31G@$D4C$^laaUPTHg8g-J<$@um&)-KXxJBRZE)eqh+VSxD-76h0`S`Nr&=laZ zW%b$skRm+$Mg%w?gSZbB8cYtRu)h&>KNi=JCjI({J8V@79b+;&Hm*d*Z=NRQs@F!WNq=yUHz^ zc`)eli$ELTBg5@RrMW5ER6|tVhmjAY0TQ(fFqkWmW#+Jv)@h1Xtk5SIWbG!4Ig1A| z1HTYJS&0%2h1Z6pLOO>Zd#qaba-)1C47wx+BK(BE-9jDG@k%o<3T=?!#;-sa2;NXD zV#9~hT1Fn2nyj&%MS}<#YBFTb0njd` z`H2yu*mZ@$hlB*uNrRE?#&#|*{AL%9b{V%$+Cos2NjBJZ?DDmFv4eteg}%5+e78nC zu6bn6j5)3_FVKV@Ggu=WB(0MnV+eJDPqHIg;P9Ij_#pH)Vl1>+NJa2pDLhYErMY{Jbx!nBhGh)ioe2842{~O=8RmS> zBOga@{NZfBT@y`_&2zao$bk}uo(o-6fO2Q{C+(#PO*;Sdq8!Z-KQ@&e$rw7*z&$Smwh zY9z|tIEa;fhA{f#I`4cRulHynf9)Ttl5w0Nd4&7$On5($aQ4x^Xv(xi7v?9Cps|YX zkw1>};zNdi)6~+8a#>Jek;@3a>aSfXJ4C{pVZPK?-i)u4iDFJ0{SBUvh@X?~Ocu2! z9r$vqz7b^9`c$a^=d1vNpCh^|uRJ|sRlMg#2my+Rrw_13rGlFyX11sr_WGbriXAo z?Nex+wqn$i{m);ggnUY-VuQ%oZ{nt6NBed=((E4Nf191|d7hcmT)od3XPd0-B6rGgbffqx_JNM@kJh1$FPW2hR?hC> zwu@}nj%R=b_X`&Qf^9S*JPQ}0DNP;XQQ)T#68cEZ4fZpBsn%jW#U=U4F(zb6$Hd37?xG!hy38`E{Ac=sW6B%0_yrB~t4*e;JkSamJk z3)dA6%FKpy4ESE*Mrbal@B5x80t{u~EU!t&b_NrH4R#xdD-Im8X zq8B3{X__E%r*rzbYx$3MNp%BLR~aoK53hugsd0b#LCQ@N%cQ6Bh_S-b!eT`N5AEe_ z3^IMBLe|Qv?SO3}k*f7{%1XxjoeOP=i}-mV!i+E$6_co`p#(Utjb;-nJ(1!H+NpMne6Uv)+VPpqTOYO2 zP|`L10lJm~8xzi6;DZxJQ1szyYr~Qrx(n^y>`VXWAB)l%lsiQor1D_P(R=b27Bxv!w2O!z_8>zVG zkLJ>#`VBbM4B|D7AmRjUcm-n78IX`3rL~bDpkripq;9%j2HCl+>;taqpx7!3`RMZ(w(#^yq z`^?oPLD!)M?57gb~Xi-MY`Bu|6GD+sOD(&*>Q##G&tPS=mSU^G>Ku-=1^$ug*9;Itvrre{5S_#(rTi{Gc9!d>RBm z=+knYm!4H<#_vhzyZsPXBa0b~t`#o(e(SDB5kIyV_j(ywtj1@oq-5?k?^Aa2b*A7% z%9Ng`@?%6!xP9K=3=hRj%Yvv29<-W_Yn-UI4DJ#9Ipyyr`w&MmZE z=iW-59%iP=wUlz9dPA^kX+VaP3>&{woy&#KSU*}SD^$sYRr}~#eWHJBXQ7x%zZ>2p zVcL^98cI&`+IuRaC|akYvW8EkW<<&kT9i0CU*#59nQiOUey(crp1Kmk2p1Rv#;k8N zW_P)*;h>4%&zC01lm|eJXwOkD7&7W9QO#sS$)wEK3gW39sv{71AU8pF1uNJ=c|qHv zHks?fEo?n;BdSAr&aLosVALTS

OmRcIUu8tM^@9#cf*3$98U<`JqNVY`vQ&KX5J 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%0DmKtXS+F{{FEA0* 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%0DnRDb6R*zGD8Lb479- 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

SxBc>`P+}* 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

ImhJF?a={?G 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%0A!f-i^m1l0}H- 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 U)p1a%L8boNP`p@bRSTT(Kb;i!iU0rr delta 355189 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

61YvMrilRxj?F{@w34m^7lLsstRN6 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

*^UNNA6ViI!8Bu)3cBg2JV4?yhnm$wb7}-! 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

E;rz;F=}ZlF{hQ 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�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 +_7~pnlEhbL4U}9a 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

+New in 14 + + \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/equals_with_itself/EqualsWithItself.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/equals_with_itself/EqualsWithItself.java new file mode 100644 index 000000000000..03347da345a5 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/equals_with_itself/EqualsWithItself.java @@ -0,0 +1,23 @@ +class EqualsWithItself { + + boolean foo(Object o) { + return o.equals(((o))); + } + + boolean withGetter() { + return getValue().equals(getValue()); + } + + boolean withMethodCall() { + return build().equals(build()); + } + + private Integer value = 1; + public Integer getValue() { + return value; + } + + public Object build() { + return new Object(); + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/EqualsWithItselfInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/EqualsWithItselfInspectionTest.java new file mode 100644 index 000000000000..cb1dfef48633 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/EqualsWithItselfInspectionTest.java @@ -0,0 +1,34 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.siyeh.ig.bugs; + +import com.intellij.codeInspection.InspectionProfileEntry; +import com.siyeh.ig.LightInspectionTestCase; +import org.jetbrains.annotations.Nullable; + +/** + * @author Bas Leijdekkers + */ +public class EqualsWithItselfInspectionTest extends LightInspectionTestCase { + + public void testEqualsWithItSelf() { doTest(); } + + @Nullable + @Override + protected InspectionProfileEntry getInspection() { + return new EqualsWithItselfInspection(); + } +} \ No newline at end of file From 80391794ca8d352af58d025ef8f770e129100d8b Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 25 Aug 2014 14:26:15 +0400 Subject: [PATCH 23/97] do not create PsiDirectory for directories under ignored (IDEA-23537) --- .../src/com/intellij/psi/impl/file/impl/FileManagerImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java b/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java index bf6b3ea81358..6b2877d83351 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java @@ -26,7 +26,6 @@ import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileTypes.ContentBasedFileSubstitutor; import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.fileTypes.FileTypeRegistry; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; @@ -411,7 +410,7 @@ public class FileManagerImpl implements FileManager { if (myFileIndex.isExcludedFile(vFile)) return null; } else { - if (FileTypeRegistry.getInstance().isFileIgnored(vFile)) return null; + if (myFileIndex.isUnderIgnored(vFile)) return null; } VirtualFile parent = vFile.getParent(); From 0325fdf05fed7eb0b4501fd18ead05f840b33413 Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 25 Aug 2014 14:26:24 +0400 Subject: [PATCH 24/97] propagate VFS events to PSI for excluded files for consistency (IDEA-23537) --- .../psi/impl/file/impl/PsiEventsTest.java | 27 +++++++++---------- .../psi/impl/file/impl/PsiVFSListener.java | 6 +++-- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/psi/impl/file/impl/PsiEventsTest.java b/java/java-tests/testSrc/com/intellij/psi/impl/file/impl/PsiEventsTest.java index 2073e2c5baa3..e144f8fddb4d 100644 --- a/java/java-tests/testSrc/com/intellij/psi/impl/file/impl/PsiEventsTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/impl/file/impl/PsiEventsTest.java @@ -43,13 +43,11 @@ public class PsiEventsTest extends PsiTestCase { private VirtualFile myPrjDir1; private VirtualFile myPrjDir2; - private VirtualFile myPrjDir3; private VirtualFile mySrcDir1; private VirtualFile mySrcDir2; private VirtualFile mySrcDir3; - private VirtualFile mySrcDir4; private VirtualFile myClsDir1; - private VirtualFile myExcludedDir1; + private VirtualFile myIgnoredDir; @Override protected void setUp() throws Exception { @@ -76,13 +74,12 @@ public class PsiEventsTest extends PsiTestCase { myClsDir1 = myPrjDir1.createChildDirectory(null, "cls1"); - myExcludedDir1 = mySrcDir1.createChildDirectory(null, "excluded"); + myIgnoredDir = mySrcDir1.createChildDirectory(null, "CVS"); PsiTestUtil.addContentRoot(myModule, myPrjDir1); PsiTestUtil.addSourceRoot(myModule, mySrcDir1); PsiTestUtil.addSourceRoot(myModule, mySrcDir2); PsiTestUtil.addContentRoot(myModule, myPrjDir2); - PsiTestUtil.addExcludedRoot(myModule, myExcludedDir1); ModuleRootModificationUtil.addModuleLibrary(myModule, myClsDir1.getUrl()); PsiTestUtil.addSourceRoot(myModule, mySrcDir3); } catch (IOException e) { @@ -106,7 +103,7 @@ public class PsiEventsTest extends PsiTestCase { String expected = "beforeChildAddition\n" + "childAdded\n"; - assertEquals(expected, string); + assertEquals(psiDir.getName(), expected, string); } public void testCreateDirectory() throws Exception { @@ -121,7 +118,7 @@ public class PsiEventsTest extends PsiTestCase { String expected = "beforeChildAddition\n" + "childAdded\n"; - assertEquals(expected, string); + assertEquals(psiDir.getName(), expected, string); } public void testDeleteFile() throws Exception { @@ -330,7 +327,7 @@ public class PsiEventsTest extends PsiTestCase { EventsTestListener listener = new EventsTestListener(); myPsiManager.addPsiTreeChangeListener(listener,getTestRootDisposable()); - file.move(null, myExcludedDir1); + file.move(null, myIgnoredDir); String string = listener.getEventsString(); String expected = @@ -341,7 +338,7 @@ public class PsiEventsTest extends PsiTestCase { } public void testMoveFile3() throws Exception { - VirtualFile file = myExcludedDir1.createChildData(null, "a.txt"); + VirtualFile file = myIgnoredDir.createChildData(null, "a.txt"); EventsTestListener listener = new EventsTestListener(); myPsiManager.addPsiTreeChangeListener(listener,getTestRootDisposable()); @@ -356,8 +353,8 @@ public class PsiEventsTest extends PsiTestCase { } public void testMoveFile4() throws Exception { - VirtualFile file = myExcludedDir1.createChildData(null, "a.txt"); - VirtualFile subdir = myExcludedDir1.createChildDirectory(null, "subdir"); + VirtualFile file = myIgnoredDir.createChildData(null, "a.txt"); + VirtualFile subdir = myIgnoredDir.createChildDirectory(null, "subdir"); EventsTestListener listener = new EventsTestListener(); myPsiManager.addPsiTreeChangeListener(listener,getTestRootDisposable()); @@ -394,7 +391,7 @@ public class PsiEventsTest extends PsiTestCase { EventsTestListener listener = new EventsTestListener(); myPsiManager.addPsiTreeChangeListener(listener,getTestRootDisposable()); - file.move(null, myExcludedDir1); + file.move(null, myIgnoredDir); String string = listener.getEventsString(); String expected = @@ -405,7 +402,7 @@ public class PsiEventsTest extends PsiTestCase { } public void testMoveDirectory3() throws Exception { - VirtualFile file = myExcludedDir1.createChildDirectory(null, "dir"); + VirtualFile file = myIgnoredDir.createChildDirectory(null, "dir"); EventsTestListener listener = new EventsTestListener(); myPsiManager.addPsiTreeChangeListener(listener,getTestRootDisposable()); @@ -420,8 +417,8 @@ public class PsiEventsTest extends PsiTestCase { } public void testMoveDirectory4() throws Exception { - VirtualFile file = myExcludedDir1.createChildDirectory(null, "dir"); - VirtualFile subdir = myExcludedDir1.createChildDirectory(null, "subdir"); + VirtualFile file = myIgnoredDir.createChildDirectory(null, "dir"); + VirtualFile subdir = myIgnoredDir.createChildDirectory(null, "subdir"); EventsTestListener listener = new EventsTestListener(); myPsiManager.addPsiTreeChangeListener(listener,getTestRootDisposable()); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java b/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java index 17dd2bca1f17..8b629875209b 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/file/impl/PsiVFSListener.java @@ -33,6 +33,7 @@ import com.intellij.openapi.roots.*; import com.intellij.openapi.roots.impl.PushedFilePropertiesUpdater; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.util.io.FileUtilRt; +import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.*; import com.intellij.openapi.vfs.impl.BulkVirtualFileListenerAdapter; import com.intellij.psi.*; @@ -237,7 +238,7 @@ public class PsiVFSListener extends VirtualFileAdapter { } } else { - if (!isExcludeRoot(vFile) && !myFileTypeManager.isFileIgnored(newName)) { + if ((!Registry.is("ide.hide.excluded.files") || !isExcludeRoot(vFile)) && !myFileTypeManager.isFileIgnored(newName)) { myManager.beforeChildAddition(treeEvent); } } @@ -443,7 +444,8 @@ public class PsiVFSListener extends VirtualFileAdapter { public void run() { PsiTreeChangeEventImpl treeEvent = new PsiTreeChangeEventImpl(myManager); - boolean isExcluded = vFile.isDirectory() && myProjectRootManager.getFileIndex().isExcluded(vFile); + boolean isExcluded = vFile.isDirectory() && + Registry.is("ide.hide.excluded.files") && myProjectRootManager.getFileIndex().isExcluded(vFile); if (oldParentDir != null && !isExcluded) { if (newParentDir != null) { treeEvent.setOldParent(oldParentDir); From d6630e5ba3a1954019d54628867441b43b1d8845 Mon Sep 17 00:00:00 2001 From: nik Date: Mon, 25 Aug 2014 14:39:08 +0400 Subject: [PATCH 25/97] test methods renamed to use meaningful names instead of numbers --- .../psi/impl/file/impl/PsiEventsTest.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/psi/impl/file/impl/PsiEventsTest.java b/java/java-tests/testSrc/com/intellij/psi/impl/file/impl/PsiEventsTest.java index e144f8fddb4d..a933d5bcacf6 100644 --- a/java/java-tests/testSrc/com/intellij/psi/impl/file/impl/PsiEventsTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/impl/file/impl/PsiEventsTest.java @@ -157,7 +157,7 @@ public class PsiEventsTest extends PsiTestCase { assertEquals(psiDirectory.getName(), expected, string); } - public void testRenameFile1() throws Exception { + public void testRenameFile() throws Exception { FileManager fileManager = myPsiManager.getFileManager(); VirtualFile file = myPrjDir1.createChildData(null, "a.txt"); PsiFile psiFile = fileManager.findFile(file); @@ -174,7 +174,7 @@ public class PsiEventsTest extends PsiTestCase { assertEquals(psiFile.getName(), expected, string); } - public void testRenameFile2() throws Exception { + public void testRenameFileChangingExtension() throws Exception { FileManager fileManager = myPsiManager.getFileManager(); VirtualFile file = myPrjDir1.createChildData(null, "a.txt"); PsiFile psiFile = fileManager.findFile(file); @@ -191,7 +191,7 @@ public class PsiEventsTest extends PsiTestCase { assertEquals(psiFile.getName(), expected, string); } - public void testRenameFile3() throws Exception { + public void testRenameFileToIgnored() throws Exception { FileManager fileManager = myPsiManager.getFileManager(); VirtualFile file = myPrjDir1.createChildData(null, "a.txt"); PsiFile psiFile = fileManager.findFile(file); @@ -209,7 +209,7 @@ public class PsiEventsTest extends PsiTestCase { assertNull(fileManager.findFile(file)); } - public void testRenameFile4() throws Exception { + public void testRenameFileFromIgnored() throws Exception { FileManager fileManager = myPsiManager.getFileManager(); VirtualFile file = myPrjDir1.createChildData(null, "CVS"); PsiDirectory psiDirectory = fileManager.findDirectory(file.getParent()); @@ -226,7 +226,7 @@ public class PsiEventsTest extends PsiTestCase { assertEquals(psiDirectory.getName(), expected, string); } - public void testRenameDirectory1() throws Exception { + public void testRenameDirectory() throws Exception { FileManager fileManager = myPsiManager.getFileManager(); VirtualFile file = myPrjDir1.createChildDirectory(null, "dir1"); PsiDirectory psiDirectory = fileManager.findDirectory(file); @@ -243,7 +243,7 @@ public class PsiEventsTest extends PsiTestCase { assertEquals(psiDirectory.getName(), expected, string); } - public void testRenameDirectory2() throws Exception { + public void testRenameDirectoryToIgnored() throws Exception { FileManager fileManager = myPsiManager.getFileManager(); VirtualFile file = myPrjDir1.createChildDirectory(null, "dir1"); PsiDirectory psiDirectory = fileManager.findDirectory(file); @@ -261,7 +261,7 @@ public class PsiEventsTest extends PsiTestCase { assertNull(fileManager.findDirectory(file)); } - public void testRenameDirectory3() throws Exception { + public void testRenameDirectoryFromIgnored() throws Exception { FileManager fileManager = myPsiManager.getFileManager(); VirtualFile file = myPrjDir1.createChildDirectory(null, "CVS"); PsiDirectory psiDirectory = fileManager.findDirectory(file.getParent()); @@ -302,7 +302,7 @@ public class PsiEventsTest extends PsiTestCase { ReadOnlyAttributeUtil.setReadOnlyAttribute(file, false); } - public void testMoveFile1() throws Exception { + public void testMoveFile() throws Exception { FileManager fileManager = myPsiManager.getFileManager(); VirtualFile file = myPrjDir1.createChildData(null, "a.txt"); PsiFile psiFile = fileManager.findFile(file); @@ -319,7 +319,7 @@ public class PsiEventsTest extends PsiTestCase { assertEquals(psiFile.getName(), expected, string); } - public void testMoveFile2() throws Exception { + public void testMoveFileToIgnoredDir() throws Exception { FileManager fileManager = myPsiManager.getFileManager(); VirtualFile file = myPrjDir1.createChildData(null, "a.txt"); PsiFile psiFile = fileManager.findFile(file); @@ -337,7 +337,7 @@ public class PsiEventsTest extends PsiTestCase { assertNull(fileManager.findFile(file)); } - public void testMoveFile3() throws Exception { + public void testMoveFileFromIgnoredDir() throws Exception { VirtualFile file = myIgnoredDir.createChildData(null, "a.txt"); EventsTestListener listener = new EventsTestListener(); @@ -352,7 +352,7 @@ public class PsiEventsTest extends PsiTestCase { assertEquals(expected, string); } - public void testMoveFile4() throws Exception { + public void testMoveFileInsideIgnoredDir() throws Exception { VirtualFile file = myIgnoredDir.createChildData(null, "a.txt"); VirtualFile subdir = myIgnoredDir.createChildDirectory(null, "subdir"); @@ -366,7 +366,7 @@ public class PsiEventsTest extends PsiTestCase { assertEquals(expected, string); } - public void testMoveDirectory1() throws Exception { + public void testMoveDirectory() throws Exception { FileManager fileManager = myPsiManager.getFileManager(); VirtualFile file = myPrjDir1.createChildDirectory(null, "dir"); PsiDirectory psiDirectory = fileManager.findDirectory(file); @@ -383,7 +383,7 @@ public class PsiEventsTest extends PsiTestCase { assertEquals(psiDirectory.getName(), expected, string); } - public void testMoveDirectory2() throws Exception { + public void testMoveDirectoryToIgnored() throws Exception { FileManager fileManager = myPsiManager.getFileManager(); VirtualFile file = myPrjDir1.createChildDirectory(null, "dir"); PsiDirectory psiDirectory = fileManager.findDirectory(file); @@ -401,7 +401,7 @@ public class PsiEventsTest extends PsiTestCase { assertNull(fileManager.findDirectory(file)); } - public void testMoveDirectory3() throws Exception { + public void testMoveDirectoryFromIgnored() throws Exception { VirtualFile file = myIgnoredDir.createChildDirectory(null, "dir"); EventsTestListener listener = new EventsTestListener(); @@ -416,7 +416,7 @@ public class PsiEventsTest extends PsiTestCase { assertEquals(expected, string); } - public void testMoveDirectory4() throws Exception { + public void testMoveDirectoryInsideIgnored() throws Exception { VirtualFile file = myIgnoredDir.createChildDirectory(null, "dir"); VirtualFile subdir = myIgnoredDir.createChildDirectory(null, "subdir"); From 1e828e744f34733522778a3021b1f52725e4b513 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 12:45:24 +0200 Subject: [PATCH 26/97] don't show empty values --- .../xdebugger/impl/evaluate/XDebuggerEditorLinePainter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEditorLinePainter.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEditorLinePainter.java index 390e61b8b53b..bf9a47c3b516 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEditorLinePainter.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/XDebuggerEditorLinePainter.java @@ -84,6 +84,9 @@ public class XDebuggerEditorLinePainter extends EditorLinePainter { } final Color color = getForeground(); final String name = value.getName(); + if (StringUtil.isEmpty(text.toString())) { + continue; + } result.add(new LineExtensionInfo(" " + name + ": ", color, null, null, Font.PLAIN)); Variable var = new Variable(name, lineNumber); From eaf2969ee1149e264ee8fb8285f33f6a945a0de5 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Mon, 25 Aug 2014 12:55:05 +0200 Subject: [PATCH 27/97] Run script with console in run content descriptor, not console one. --- .../AbstractConsoleRunnerWithHistory.java | 10 +- .../python/console/PydevConsoleRunner.java | 43 ++++++-- .../run/PythonScriptCommandLineState.java | 102 ++++++++++++++++-- 3 files changed, 135 insertions(+), 20 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java index 7bcabebf256a..e83868b4d1d7 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java @@ -104,6 +104,13 @@ public abstract class AbstractConsoleRunnerWithHistory environmentVariables, String ... statementsToExecute) { + @NotNull Sdk sdk, @NotNull final PyConsoleType consoleType, + @Nullable final String workingDir, + Map environmentVariables, String... statementsToExecute) { super(project, consoleType.getTitle(), workingDir); mySdk = sdk; myConsoleType = consoleType; @@ -281,6 +281,30 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistoryasList(e), "Python Console", null); + } + + ProgressManager.getInstance().run(new Task.Backgroundable(getProject(), "Connecting to console", false) { + @Override + public void run(@NotNull final ProgressIndicator indicator) { + indicator.setText("Connecting to console..."); + connect(myStatementsToExecute); + } + }); + } + public void run() { UIUtil.invokeAndWaitIfNeeded(new Runnable() { @Override @@ -337,9 +361,9 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory environmentVariables, - int[] ports) { + protected CommandLineArgumentsProvider createCommandLineArgumentsProvider(final Sdk sdk, + final Map environmentVariables, + int[] ports) { final ArrayList args = new ArrayList(); args.add(sdk.getHomePath()); final String versionString = sdk.getVersionString(); @@ -518,8 +542,11 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory actions = Lists.newArrayList(createActions(runner.getConsoleView(), runner.getProcessHandler())); return new DefaultExecutionResult(runner.getConsoleView(), runner.getProcessHandler()); } @@ -76,4 +97,67 @@ public class PythonScriptCommandLineState extends PythonCommandLineState { commandLine.setWorkDirectory(myConfig.getWorkingDirectory()); } } + + /** + * @author traff + */ + public class PythonScriptWithConsoleRunner extends PydevConsoleRunner { + + private CommandLinePatcher[] myPatchers; + + public PythonScriptWithConsoleRunner(@NotNull Project project, + @NotNull Sdk sdk, + @NotNull PyConsoleType consoleType, + @Nullable String workingDir, + Map environmentVariables, CommandLinePatcher[] patchers, String... statementsToExecute) { + super(project, sdk, consoleType, workingDir, environmentVariables, statementsToExecute); + myPatchers = patchers; + } + + @Override + protected void createContentDescriptor() { + //don't create + } + + @Override + protected CommandLineArgumentsProvider createCommandLineArgumentsProvider(final Sdk sdk, + final Map environmentVariables, + int[] ports) { + + final ArrayList args = new ArrayList(); + args.add(sdk.getHomePath()); + final String versionString = sdk.getVersionString(); + if (versionString == null || !versionString.toLowerCase().contains("jython")) { + args.add("-u"); + } + args.add(FileUtil.toSystemDependentName(PythonHelpersLocator.getHelperPath("pydev/pydev_run_in_console.py"))); + for (int port : ports) { + args.add(String.valueOf(port)); + } + + try { + GeneralCommandLine cmd = generateCommandLine(myPatchers); + args.addAll(cmd.getParametersList().getList()); + } catch (Exception e) { + //pass + } + return new CommandLineArgumentsProvider() { + @Override + public String[] getArguments() { + return ArrayUtil.toStringArray(args); + } + + @Override + public boolean passParentEnvs() { + return false; + } + + @Override + public Map getAdditionalEnvs() { + return addDefaultEnvironments(sdk, environmentVariables); + } + }; + + } + } } From f9b87a15cb480875c9f87d6bdded842733542ff2 Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Mon, 25 Aug 2014 14:59:30 +0400 Subject: [PATCH 28/97] CPP-618 Add possibility to run CLion as desktop app on Ubuntu --- .../src/com/intellij/ide/actions/CreateDesktopEntryAction.java | 2 +- .../com/intellij/ide/customize/CustomizeDesktopEntryStep.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/actions/CreateDesktopEntryAction.java b/platform/platform-impl/src/com/intellij/ide/actions/CreateDesktopEntryAction.java index 3641708ab40c..136f4b166e1a 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/CreateDesktopEntryAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/CreateDesktopEntryAction.java @@ -112,7 +112,7 @@ public class CreateDesktopEntryAction extends DumbAwareAction { } catch (Exception e) { if (ApplicationManager.getApplication() == null) { - return; + throw new RuntimeException(e); } final String message = e.getMessage(); if (!StringUtil.isEmptyOrSpaces(message)) { diff --git a/platform/platform-impl/src/com/intellij/ide/customize/CustomizeDesktopEntryStep.java b/platform/platform-impl/src/com/intellij/ide/customize/CustomizeDesktopEntryStep.java index fd2ecc8d96d3..d61c356cffd1 100644 --- a/platform/platform-impl/src/com/intellij/ide/customize/CustomizeDesktopEntryStep.java +++ b/platform/platform-impl/src/com/intellij/ide/customize/CustomizeDesktopEntryStep.java @@ -87,6 +87,6 @@ public class CustomizeDesktopEntryStep extends AbstractCustomizeWizardStep { @Override protected String getHTMLFooter() { - return "Desktop entry can be configured later in Tools | Create Desktop Entry..."; + return "Desktop entry can be created later in Tools | Create Desktop Entry..."; } } \ No newline at end of file From 3aee050fe7af416da3487e2f3468d4ec2dc693aa Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Mon, 25 Aug 2014 13:32:59 +0200 Subject: [PATCH 29/97] Fix execute action. --- .../execution/runners/AbstractConsoleRunnerWithHistory.java | 4 ++-- .../src/com/jetbrains/python/console/PydevConsoleRunner.java | 2 +- .../jetbrains/python/run/PythonScriptCommandLineState.java | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java index e83868b4d1d7..d1c3c4877493 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java @@ -104,13 +104,13 @@ public abstract class AbstractConsoleRunnerWithHistory myConsoleListeners = ContainerUtil.createLockFreeCopyOnWriteList(); private final PyConsoleType myConsoleType; private Map myEnvironmentVariables; diff --git a/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java b/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java index 0b9714137cc2..fa64fd614091 100644 --- a/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java +++ b/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java @@ -115,8 +115,9 @@ public class PythonScriptCommandLineState extends PythonCommandLineState { } @Override - protected void createContentDescriptor() { - //don't create + protected void createContentDescriptorAndActions() { + AnAction a = createConsoleExecAction(myConsoleExecuteActionHandler); + registerActionShortcuts(Lists.newArrayList(a), getConsoleView().getConsole().getConsoleEditor().getComponent()); } @Override From 65d7954fe9cd2041683f47f56b77d10366f0fb34 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Mon, 25 Aug 2014 13:34:31 +0200 Subject: [PATCH 30/97] Runner script for run with command-line. --- python/helpers/pydev/pydev_run_in_console.py | 83 ++++++++++++++++++++ python/helpers/pydev/pydevconsole.py | 4 +- 2 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 python/helpers/pydev/pydev_run_in_console.py diff --git a/python/helpers/pydev/pydev_run_in_console.py b/python/helpers/pydev/pydev_run_in_console.py new file mode 100644 index 000000000000..1b8e1d230175 --- /dev/null +++ b/python/helpers/pydev/pydev_run_in_console.py @@ -0,0 +1,83 @@ + +from pydevconsole import * + +import pydev_imports + + +def run_file(file, globals=None, locals=None): + if os.path.isdir(file): + new_target = os.path.join(file, '__main__.py') + if os.path.isfile(new_target): + file = new_target + + if globals is None: + # patch provided by: Scott Schlesier - when script is run, it does not + # use globals from pydevd: + # This will prevent the pydevd script from contaminating the namespace for the script to be debugged + + # pretend pydevd is not the main module, and + # convince the file to be debugged that it was loaded as main + sys.modules['pydevd'] = sys.modules['__main__'] + sys.modules['pydevd'].__name__ = 'pydevd' + + from imp import new_module + m = new_module('__main__') + sys.modules['__main__'] = m + if hasattr(sys.modules['pydevd'], '__loader__'): + setattr(m, '__loader__', getattr(sys.modules['pydevd'], '__loader__')) + + m.__file__ = file + globals = m.__dict__ + try: + globals['__builtins__'] = __builtins__ + except NameError: + pass # Not there on Jython... + + if locals is None: + locals = globals + + + print('Running %s'%file) + pydev_imports.execfile(file, globals, locals) # execute the script + + return globals + +#======================================================================================================================= +# main +#======================================================================================================================= +if __name__ == '__main__': + sys.stdin = BaseStdIn() + port, client_port = sys.argv[1:3] + + del sys.argv[1] + del sys.argv[1] + + file = sys.argv[1] + + import pydev_localhost + + if int(port) == 0 and int(client_port) == 0: + (h, p) = pydev_localhost.get_socket_name() + + client_port = p + + host = pydev_localhost.get_localhost() + + + #replace exit (see comments on method) + #note that this does not work in jython!!! (sys method can't be replaced). + sys.exit = DoExit + + interpreter = InterpreterInterface(host, int(client_port), threading.currentThread()) + + server_thread = threading.Thread(target=start_server, + name='ServerThread', + args=(host, int(port), interpreter)) + server_thread.setDaemon(True) + server_thread.start() + + globals = run_file(file, None, None) + + interpreter.getNamespace().update(globals) + + process_exec_queue(interpreter) \ No newline at end of file diff --git a/python/helpers/pydev/pydevconsole.py b/python/helpers/pydev/pydevconsole.py index 565f9db45d1d..e5bf49411416 100644 --- a/python/helpers/pydev/pydevconsole.py +++ b/python/helpers/pydev/pydevconsole.py @@ -248,7 +248,7 @@ except: #======================================================================================================================= # _DoExit #======================================================================================================================= -def _DoExit(*args): +def DoExit(*args): ''' We have to override the exit because calling sys.exit will only actually exit the main thread, and as we're in a Xml-rpc server, that won't work. @@ -321,7 +321,7 @@ def start_server(host, port, interpreter): def StartServer(host, port, client_port): #replace exit (see comments on method) #note that this does not work in jython!!! (sys method can't be replaced). - sys.exit = _DoExit + sys.exit = DoExit interpreter = InterpreterInterface(host, client_port, threading.currentThread()) From 5c6c737faba1f3950c2add26aeb4bbc9eb16444a Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 25 Aug 2014 15:35:15 +0400 Subject: [PATCH 31/97] enable scratches by default --- platform/util/resources/misc/registry.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 93a3464916ef..8783e16271c8 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -355,7 +355,7 @@ embed.scene.builder=true dsm.retina.darcula.legend=true dsm.retina.darcula.legend.description=Experimental DSM legend component -ide.scratch.enabled=false +ide.scratch.enabled=true ide.show.progress.without.status.bar=false editor.injected.highlighting.enabled=true From a45bc08ab194903926e8c79f0759dcbbf5d3247c Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Mon, 25 Aug 2014 13:36:42 +0200 Subject: [PATCH 32/97] Missing actions. --- .../com/jetbrains/python/run/PythonScriptCommandLineState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java b/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java index fa64fd614091..9ebc5c53afb4 100644 --- a/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java +++ b/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java @@ -70,7 +70,7 @@ public class PythonScriptCommandLineState extends PythonCommandLineState { List actions = Lists.newArrayList(createActions(runner.getConsoleView(), runner.getProcessHandler())); - return new DefaultExecutionResult(runner.getConsoleView(), runner.getProcessHandler()); + return new DefaultExecutionResult(runner.getConsoleView(), runner.getProcessHandler(), actions.toArray(new AnAction[actions.size()])); } else { return super.execute(executor, patchers); From a1a01a86d85700b2cb3bee1c1b9bb232f9c7b190 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 25 Aug 2014 13:10:11 +0400 Subject: [PATCH 33/97] IDEA-86150 IDEA-86151 diff: fix merge with external tool * mark resolved conflicts as resolved * refresh filesystem to locate external changes --- .../diff/impl/external/BaseExternalTool.java | 17 +++++---- .../diff/impl/external/ExtMergeFiles.java | 35 +++++++++++++++++++ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/BaseExternalTool.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/BaseExternalTool.java index 9ae17ec50df0..4a76a6f95765 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/BaseExternalTool.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/BaseExternalTool.java @@ -91,12 +91,8 @@ abstract class BaseExternalTool implements DiffTool { } public void show(DiffRequest request) { - for (DiffContent diffContent : request.getContents()) { - Document document = diffContent.getDocument(); - if (document != null) { - FileDocumentManager.getInstance().saveDocument(document); - } - } + saveContents(request); + GeneralCommandLine commandLine = new GeneralCommandLine(); commandLine.setExePath(getToolPath()); try { @@ -109,6 +105,15 @@ abstract class BaseExternalTool implements DiffTool { } } + protected void saveContents(DiffRequest request) { + for (DiffContent diffContent : request.getContents()) { + Document document = diffContent.getDocument(); + if (document != null) { + FileDocumentManager.getInstance().saveDocument(document); + } + } + } + @Nullable protected String convertToPath(DiffRequest request, int index) throws Exception { final ContentExternalizer externalize = externalize(request, index); diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java index 82313a5c9c35..b65454d64206 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java @@ -15,9 +15,15 @@ */ package com.intellij.openapi.diff.impl.external; +import com.intellij.execution.ExecutionException; +import com.intellij.execution.configurations.GeneralCommandLine; +import com.intellij.execution.util.ExecutionErrorDialog; +import com.intellij.openapi.diff.DiffBundle; import com.intellij.openapi.diff.DiffContent; import com.intellij.openapi.diff.DiffRequest; import com.intellij.openapi.diff.impl.mergeTool.MergeRequestImpl; +import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.text.StringUtil; import java.util.ArrayList; @@ -35,6 +41,7 @@ public class ExtMergeFiles extends BaseExternalTool { @Override public boolean isAvailable(DiffRequest request) { + if (!(request instanceof MergeRequestImpl)) return false; DiffContent[] contents = request.getContents(); if (contents.length != 3) return false; if (externalize(request, 0) == null) return false; @@ -60,4 +67,32 @@ public class ExtMergeFiles extends BaseExternalTool { } return params; } + + public void show(DiffRequest request) { + saveContents(request); + + int result = DialogWrapper.CANCEL_EXIT_CODE; + + GeneralCommandLine commandLine = new GeneralCommandLine(); + commandLine.setExePath(getToolPath()); + try { + commandLine.addParameters(getParameters(request)); + commandLine.createProcess(); + + if (Messages.YES == Messages.showYesNoDialog(request.getProject(), + "Press \"Mark as Resolved\" when you finish resolving conflicts in the external tool", + "Merge In External Tool", "Mark as Resolved", "Cancel", null)) { + result = DialogWrapper.OK_EXIT_CODE; + } + ((MergeRequestImpl)request).getResultContent().getFile().refresh(false, false); + // We can actually check exit code of external tool, but some of them could work with tabs -> do not close at all + } + catch (Exception e) { + ExecutionErrorDialog + .show(new ExecutionException(e.getMessage()), DiffBundle.message("cant.launch.diff.tool.error.message"), request.getProject()); + } + finally { + ((MergeRequestImpl)request).setResult(result); + } + } } From f3f33014d62881b8b0018b1476e9ac3cce28dcbc Mon Sep 17 00:00:00 2001 From: Denis Fokin Date: Mon, 25 Aug 2014 15:42:13 +0400 Subject: [PATCH 34/97] IDEA-129004 Detached sheet dialogs --- .../ShowDelayedMessageInternalAction.java | 58 +++++++++++++++++++ .../intellij/ui/messages/SheetMessage.java | 12 ++++ .../src/idea/PlatformActions.xml | 2 + 3 files changed, 72 insertions(+) create mode 100644 platform/platform-impl/src/com/intellij/notification/impl/actions/ShowDelayedMessageInternalAction.java diff --git a/platform/platform-impl/src/com/intellij/notification/impl/actions/ShowDelayedMessageInternalAction.java b/platform/platform-impl/src/com/intellij/notification/impl/actions/ShowDelayedMessageInternalAction.java new file mode 100644 index 000000000000..ad133f1c7574 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/notification/impl/actions/ShowDelayedMessageInternalAction.java @@ -0,0 +1,58 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.notification.impl.actions; + +import com.intellij.CommonBundle; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.application.ApplicationBundle; +import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.ui.MessageDialogBuilder; + +import javax.swing.*; + +/** + * @author Denis Fokin + */ +public class ShowDelayedMessageInternalAction extends AnAction implements DumbAware{ + @Override + public void actionPerformed(AnActionEvent e) { + + new Thread() { + @Override + public void run() { + super.run(); + + //noinspection EmptyCatchBlock + try { + Thread.sleep(3000); + } + catch (InterruptedException e1) {} // does not matter for an internal action + + //noinspection SSBasedInspection + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + MessageDialogBuilder.yesNo("Nothing happens after that", "Some message goes here").yesText( + ApplicationBundle.message("command.exit")).noText( + CommonBundle.message("button.cancel")).show(); + } + }); + } + }.start(); + + } +} diff --git a/platform/platform-impl/src/com/intellij/ui/messages/SheetMessage.java b/platform/platform-impl/src/com/intellij/ui/messages/SheetMessage.java index 446722c081e4..fee84330f0a2 100755 --- a/platform/platform-impl/src/com/intellij/ui/messages/SheetMessage.java +++ b/platform/platform-impl/src/com/intellij/ui/messages/SheetMessage.java @@ -70,6 +70,8 @@ public class SheetMessage { final Component recentFocusOwner = activeWindow == null ? null : activeWindow.getMostRecentFocusOwner(); beforeShowFocusOwner = new WeakReference(recentFocusOwner); + maximizeIfNeeded(owner); + myWindow = new JDialog(owner, "This should not be shown", Dialog.ModalityType.APPLICATION_MODAL); myWindow.getRootPane().putClientProperty("apple.awt.draggableWindowBackground", Boolean.FALSE); @@ -132,6 +134,16 @@ public class SheetMessage { } + private static void maximizeIfNeeded(final Window owner) { + if (owner == null) return; + if (owner instanceof Frame) { + Frame f = (Frame)owner; + if (f.getState() == Frame.ICONIFIED) { + f.setState(Frame.NORMAL); + } + } + } + private void setWindowOpacity(float opacity) { try { Method setOpacityMethod = myWindow.getClass().getMethod("setOpacity", Float.TYPE); diff --git a/platform/platform-resources/src/idea/PlatformActions.xml b/platform/platform-resources/src/idea/PlatformActions.xml index 7773a2b00e49..0c970d8e802f 100644 --- a/platform/platform-resources/src/idea/PlatformActions.xml +++ b/platform/platform-resources/src/idea/PlatformActions.xml @@ -611,6 +611,8 @@ + Date: Mon, 25 Aug 2014 12:19:11 +0200 Subject: [PATCH 35/97] cleanup --- .../util/net/HTTPProxySettingsDialog.java | 18 +++--- .../util/net/HTTPProxySettingsPanel.java | 60 ++++++++++++------- 2 files changed, 46 insertions(+), 32 deletions(-) diff --git a/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsDialog.java b/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsDialog.java index 52dfa7e7e5ab..86b5e441ff1e 100644 --- a/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsDialog.java +++ b/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsDialog.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,13 +22,6 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.event.ActionEvent; -/** - * Created by IntelliJ IDEA. - * User: stathik - * Date: Oct 21, 2003 - * Time: 4:35:44 PM - * To change this template use Options | File Templates. - */ public class HTTPProxySettingsDialog extends DialogWrapper { private final HTTPProxySettingsPanel panel; private final Action okAction; @@ -36,29 +29,34 @@ public class HTTPProxySettingsDialog extends DialogWrapper { public HTTPProxySettingsDialog() { super(false); + setTitle(CommonBundle.message("title.http.proxy.settings")); panel = new HTTPProxySettingsPanel(HttpConfigurable.getInstance()); panel.reset(); okAction = new AbstractAction(CommonBundle.getOkButtonText()) { - public void actionPerformed(ActionEvent e) { + @Override + public void actionPerformed(@NotNull ActionEvent e) { panel.apply(); close(OK_EXIT_CODE); } }; okAction.putValue(DEFAULT_ACTION, Boolean.TRUE.toString()); cancelAction = new AbstractAction(CommonBundle.getCancelButtonText()) { - public void actionPerformed(ActionEvent e) { + @Override + public void actionPerformed(@NotNull ActionEvent e) { close(CANCEL_EXIT_CODE); } }; init(); } + @Override protected JComponent createCenterPanel() { return panel.createComponent(); } + @Override @NotNull protected Action[] createActions() { return new Action[]{okAction, cancelAction}; diff --git a/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsPanel.java b/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsPanel.java index 46ea422a3f69..742ca465b4d0 100644 --- a/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsPanel.java +++ b/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,13 +43,6 @@ import java.io.IOException; import java.net.HttpURLConnection; import java.util.concurrent.atomic.AtomicReference; -/** - * Created by IntelliJ IDEA. - * User: stathik - * Date: Aug 28, 2003 - * Time: 3:52:47 PM - * To change this template use Options | File Templates. - */ public class HTTPProxySettingsPanel implements SearchableConfigurable, Configurable.NoScroll { public static final String NAME = "Proxy"; private JPanel myMainPanel; @@ -83,11 +76,13 @@ public class HTTPProxySettingsPanel implements SearchableConfigurable, Configura private final HttpConfigurable myHttpConfigurable; private volatile boolean myConnectionCheckInProgress; + @Override public boolean isModified() { - boolean isModified = false; HttpConfigurable httpConfigurable = myHttpConfigurable; - if (! Comparing.equal(myProxyExceptions.getText().trim(), httpConfigurable.PROXY_EXCEPTIONS)) return true; - isModified |= httpConfigurable.USE_PROXY_PAC != myAutoDetectProxyRb.isSelected(); + if (!Comparing.equal(myProxyExceptions.getText().trim(), httpConfigurable.PROXY_EXCEPTIONS)) { + return true; + } + boolean isModified = httpConfigurable.USE_PROXY_PAC != myAutoDetectProxyRb.isSelected(); isModified |= httpConfigurable.USE_PAC_URL != myPacUrlCheckBox.isSelected(); isModified |= !Comparing.strEqual(httpConfigurable.PAC_URL, myPacUrlTextField.getText()); isModified |= httpConfigurable.USE_HTTP_PROXY != myUseHTTPProxyRb.isSelected(); @@ -130,19 +125,21 @@ public class HTTPProxySettingsPanel implements SearchableConfigurable, Configura } myProxyAuthCheckBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { + @Override + public void actionPerformed(@NotNull ActionEvent e) { enableProxyAuthentication(myProxyAuthCheckBox.isSelected()); } }); myPacUrlCheckBox.addActionListener(new ActionListener() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(@NotNull ActionEvent e) { myPacUrlTextField.setEnabled(myPacUrlCheckBox.isSelected()); } }); final ActionListener listener = new ActionListener() { - public void actionPerformed(ActionEvent e) { + @Override + public void actionPerformed(@NotNull ActionEvent e) { enableProxy(myUseHTTPProxyRb.isSelected()); } }; @@ -153,16 +150,17 @@ public class HTTPProxySettingsPanel implements SearchableConfigurable, Configura myClearPasswordsButton.addActionListener(new ActionListener() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(@NotNull ActionEvent e) { myHttpConfigurable.clearGenericPasswords(); - Messages.showMessageDialog(myMainPanel, "Proxy passwords were cleared.", "Auto-detected proxy", Messages.getInformationIcon()); + //noinspection DialogTitleCapitalization + Messages.showMessageDialog(myMainPanel, "Proxy passwords were cleared.", "Auto-detected Proxy", Messages.getInformationIcon()); } }); if (HttpConfigurable.getInstance() != null) { myCheckButton.addActionListener(new ActionListener() { @Override - public void actionPerformed(ActionEvent e) { + public void actionPerformed(@NotNull ActionEvent e) { final String title = "Check Proxy Settings"; final String answer = Messages .showInputDialog(myMainPanel, "Warning: your settings will be saved.\n\nEnter any URL to check connection to:", @@ -205,7 +203,7 @@ public class HTTPProxySettingsPanel implements SearchableConfigurable, Configura public void run() { myConnectionCheckInProgress = false; reset(); // since password might have been set - Component parent = null; + Component parent; if (myMainPanel.isShowing()) { parent = myMainPanel; myCheckButton.setText("Check connection"); @@ -245,6 +243,7 @@ public class HTTPProxySettingsPanel implements SearchableConfigurable, Configura return ! myNoProxyRb.isSelected() && ! myConnectionCheckInProgress; } + @Override public void reset() { myNoProxyRb.setSelected(true); // default HttpConfigurable httpConfigurable = myHttpConfigurable; @@ -280,10 +279,11 @@ public class HTTPProxySettingsPanel implements SearchableConfigurable, Configura } } - private String errorText(final String s) { + private static String errorText(String s) { return "Problem with connection: " + s; } + @Override public void apply () { HttpConfigurable httpConfigurable = myHttpConfigurable; if (isModified()){ @@ -351,40 +351,56 @@ public class HTTPProxySettingsPanel implements SearchableConfigurable, Configura return myMainPanel; } + @Override public JComponent createComponent() { return myMainPanel; } + @Override @NotNull public String getId() { return getHelpTopic(); } + @Override public Runnable enableSearch(final String option) { return null; } + @Override @Nls public String getDisplayName() { return NAME; } + @Override + @NotNull public String getHelpTopic() { return "http.proxy"; } + @Deprecated + /** + * @deprecated to remove in IDEA 15 + */ public void addActionListener(final ActionListener actionListener) { myProxyLoginTextField.addActionListener(actionListener); DocumentListener docListener = new DocumentListener() { - public void insertUpdate(DocumentEvent e) { + @Override + public void insertUpdate(@NotNull DocumentEvent e) { + //noinspection ConstantConditions actionListener.actionPerformed(null); } - public void removeUpdate(DocumentEvent e) { + @Override + public void removeUpdate(@NotNull DocumentEvent e) { + //noinspection ConstantConditions actionListener.actionPerformed(null); } - public void changedUpdate(DocumentEvent e) { + @Override + public void changedUpdate(@NotNull DocumentEvent e) { + //noinspection ConstantConditions actionListener.actionPerformed(null); } }; From 5eabfa4224cb2a8fe1619d575a67fcab367e42b3 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 25 Aug 2014 12:36:16 +0200 Subject: [PATCH 36/97] cleanup --- .../intellij/util/net/HttpConfigurable.java | 81 ++++++++++--------- .../com/intellij/util/proxy/CommonProxy.java | 27 +++---- 2 files changed, 53 insertions(+), 55 deletions(-) diff --git a/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java b/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java index d51891a8ffe4..82a2dbb3ec82 100644 --- a/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java +++ b/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java @@ -27,8 +27,10 @@ import com.intellij.openapi.ui.Messages; import com.intellij.openapi.ui.popup.util.PopupUtil; import com.intellij.openapi.util.*; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.CharsetToolkit; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.openapi.wm.IdeFrame; +import com.intellij.util.Base64; import com.intellij.util.SystemProperties; import com.intellij.util.WaitForProgressToShow; import com.intellij.util.proxy.CommonProxy; @@ -36,7 +38,8 @@ import com.intellij.util.proxy.JavaProxyProperty; import com.intellij.util.xmlb.XmlSerializer; import com.intellij.util.xmlb.XmlSerializerUtil; import com.intellij.util.xmlb.annotations.Transient; -import org.apache.commons.codec.binary.Base64; +import gnu.trove.THashMap; +import gnu.trove.THashSet; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -48,25 +51,19 @@ import java.lang.reflect.InvocationTargetException; import java.net.*; import java.util.*; -/** - * Created by IntelliJ IDEA. - * User: stathik - * Date: Oct 7, 2003 - * Time: 3:58:23 PM - * To change this template use Options | File Templates. - */ @State( name = "HttpConfigurable", storages = { - @Storage( file = StoragePathMacros.APP_CONFIG + "/other.xml" ), - @Storage( file = StoragePathMacros.APP_CONFIG + "/proxy.settings.xml" ) + @Storage(file = StoragePathMacros.APP_CONFIG + "/other.xml"), + @Storage(file = StoragePathMacros.APP_CONFIG + "/proxy.settings.xml") }, storageChooser = HttpConfigurable.StorageChooser.class ) public class HttpConfigurable implements PersistentStateComponent, ApplicationComponent, ExportableApplicationComponent { public static final int CONNECTION_TIMEOUT = SystemProperties.getIntProperty("idea.connection.timeout", 10000); - private static final Logger LOG = Logger.getInstance("#com.intellij.util.net.HttpConfigurable"); + private static final Logger LOG = Logger.getInstance(HttpConfigurable.class); + public boolean PROXY_TYPE_IS_SOCKS = false; public boolean USE_HTTP_PROXY = false; public boolean USE_PROXY_PAC = false; @@ -79,22 +76,27 @@ public class HttpConfigurable implements PersistentStateComponent myGenericPasswords = new HashMap(); - public Set myGenericCancelled = new HashSet(); - private transient final Object myLock = new Object(); - private IdeaWideProxySelector mySelector; - private IdeaWideAuthenticator myAuthenticator; - public transient Getter myTestAuthRunnable = new StaticGetter(null); - public transient Getter myTestGenericAuthRunnable = new StaticGetter(null); + + private final Map myGenericPasswords = new THashMap(); + private final Set myGenericCancelled = new THashSet(); + + private transient IdeaWideProxySelector mySelector; + public String PROXY_EXCEPTIONS = ""; public boolean USE_PAC_URL = false; public String PAC_URL = ""; + private transient final Object myLock = new Object(); + + @SuppressWarnings("UnusedDeclaration") + public transient Getter myTestAuthRunnable = new StaticGetter(null); + public transient Getter myTestGenericAuthRunnable = new StaticGetter(null); + public static HttpConfigurable getInstance() { return ServiceManager.getService(HttpConfigurable.class); } - public static boolean editConfigurable(final JComponent parent) { + public static boolean editConfigurable(JComponent parent) { return ShowSettingsUtil.getInstance().editConfigurable(parent, new HTTPProxySettingsPanel(getInstance())); } @@ -113,10 +115,9 @@ public class HttpConfigurable implements PersistentStateComponent(); + to.myGenericPasswords.clear(); for (Map.Entry entry : from.myGenericPasswords.entrySet()) { if (Boolean.TRUE.equals(entry.getValue().isStore())) { to.myGenericPasswords.put(entry.getKey(), entry.getValue()); @@ -157,9 +158,9 @@ public class HttpConfigurable implements PersistentStateComponent Date: Mon, 25 Aug 2014 12:59:36 +0200 Subject: [PATCH 37/97] cleanup --- .../intellij/util/net/HttpConfigurable.java | 31 ++++++++++--------- .../src/com/intellij/util/net/NetUtils.java | 2 +- .../com/intellij/util/proxy/CommonProxy.java | 15 ++++----- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java b/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java index 82a2dbb3ec82..599b2600bb31 100644 --- a/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java +++ b/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java @@ -33,6 +33,7 @@ import com.intellij.openapi.wm.IdeFrame; import com.intellij.util.Base64; import com.intellij.util.SystemProperties; import com.intellij.util.WaitForProgressToShow; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.proxy.CommonProxy; import com.intellij.util.proxy.JavaProxyProperty; import com.intellij.util.xmlb.XmlSerializer; @@ -59,8 +60,7 @@ import java.util.*; }, storageChooser = HttpConfigurable.StorageChooser.class ) -public class HttpConfigurable implements PersistentStateComponent, ApplicationComponent, - ExportableApplicationComponent { +public class HttpConfigurable implements PersistentStateComponent, ExportableApplicationComponent { public static final int CONNECTION_TIMEOUT = SystemProperties.getIntProperty("idea.connection.timeout", 10000); private static final Logger LOG = Logger.getInstance(HttpConfigurable.class); @@ -348,8 +348,6 @@ public class HttpConfigurable implements PersistentStateComponent proxies = CommonProxy.getInstance().select(url); - if (proxies == null || proxies.isEmpty()) { + if (ContainerUtil.isEmpty(proxies)) { urlConnection = url.openConnection(); - } else { - IOException ioe = null; + } + else { + IOException exception = null; for (Proxy proxy : proxies) { try { urlConnection = url.openConnection(proxy); - } catch (IOException e) { + } + catch (IOException e) { // continue iteration - ioe = e; + exception = e; } } - if (urlConnection == null && ioe != null) { - throw ioe; + if (urlConnection == null && exception != null) { + throw exception; } } - if (urlConnection != null) { - urlConnection.setReadTimeout(CONNECTION_TIMEOUT); - urlConnection.setConnectTimeout(CONNECTION_TIMEOUT); - } + + assert urlConnection != null; + urlConnection.setReadTimeout(CONNECTION_TIMEOUT); + urlConnection.setConnectTimeout(CONNECTION_TIMEOUT); return urlConnection; } diff --git a/platform/platform-api/src/com/intellij/util/net/NetUtils.java b/platform/platform-api/src/com/intellij/util/net/NetUtils.java index eb56e08e4d64..b01d4db1f1cb 100644 --- a/platform/platform-api/src/com/intellij/util/net/NetUtils.java +++ b/platform/platform-api/src/com/intellij/util/net/NetUtils.java @@ -66,7 +66,7 @@ public class NetUtils { } public static boolean isLocalhost(@NotNull String host) { - return host.equalsIgnoreCase("localhost") || host.equals("127.0.0.1"); + return host.equalsIgnoreCase("localhost") || host.equals("127.0.0.1") || host.equals("::1"); } private static boolean canBindToLocalSocket(String host, int port) { diff --git a/platform/platform-api/src/com/intellij/util/proxy/CommonProxy.java b/platform/platform-api/src/com/intellij/util/proxy/CommonProxy.java index 4662b1c61476..d8d54470bd37 100644 --- a/platform/platform-api/src/com/intellij/util/proxy/CommonProxy.java +++ b/platform/platform-api/src/com/intellij/util/proxy/CommonProxy.java @@ -22,6 +22,8 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.net.NetUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -206,14 +208,12 @@ public class CommonProxy extends ProxySelector { } try { ourReenterDefence.set(Boolean.TRUE); - final String host = uri.getHost() == null ? "" : uri.getHost(); - final int port = correctPortByProtocol(uri); - final String protocol = uri.getScheme(); - if ("localhost".equals(host) || "127.0.0.1".equals(host) || "::1".equals(host)) { + String host = StringUtil.notNullize(uri.getHost()); + if (NetUtils.isLocalhost(host)) { return NO_PROXY_LIST; } - final HostInfo info = new HostInfo(protocol, host, port); + final HostInfo info = new HostInfo(uri.getScheme(), host, correctPortByProtocol(uri)); final Map copy; synchronized (myLock) { if (myNoProxy.contains(Pair.create(info, Thread.currentThread()))) { @@ -224,13 +224,14 @@ public class CommonProxy extends ProxySelector { } for (Map.Entry entry : copy.entrySet()) { final List proxies = entry.getValue().select(uri); - if (proxies != null && proxies.size() > 0) { + if (!ContainerUtil.isEmpty(proxies)) { LOG.debug("CommonProxy.select returns custom proxy for " + uri.toString() + ", " + proxies.toString()); return proxies; } } return NO_PROXY_LIST; - } finally { + } + finally { ourReenterDefence.remove(); } } From 9ca0a3f57db98c878624686e83bdf4e9728abcbb Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 25 Aug 2014 13:07:07 +0200 Subject: [PATCH 38/97] cleanup --- .../openapi/options/ShowSettingsUtil.java | 2 +- .../ide/actions/ShowSettingsUtilImpl.java | 25 +++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/options/ShowSettingsUtil.java b/platform/platform-api/src/com/intellij/openapi/options/ShowSettingsUtil.java index aa6d9618482a..aac770691806 100644 --- a/platform/platform-api/src/com/intellij/openapi/options/ShowSettingsUtil.java +++ b/platform/platform-api/src/com/intellij/openapi/options/ShowSettingsUtil.java @@ -41,7 +41,7 @@ public abstract class ShowSettingsUtil { public abstract boolean editConfigurable(@Nullable Project project, Configurable configurable, @Nullable Runnable advancedInitialization); - public abstract boolean editConfigurable(Component parent, Configurable configurable); + public abstract boolean editConfigurable(@Nullable Component parent, @NotNull Configurable configurable); public abstract boolean editConfigurable(Component parent, Configurable configurable, Runnable advancedInitialization); diff --git a/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.java b/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.java index 05f7a2019003..e901b1b32875 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.java @@ -27,6 +27,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.ui.update.Activatable; import com.intellij.util.ui.update.UiNotifyConnector; import org.jetbrains.annotations.NotNull; @@ -42,7 +43,7 @@ import java.util.concurrent.atomic.AtomicBoolean; */ public class ShowSettingsUtilImpl extends ShowSettingsUtil { private static final Logger LOG = Logger.getInstance("#com.intellij.ide.actions.ShowSettingsUtilImpl"); - private AtomicBoolean myShown = new AtomicBoolean(false); + private final AtomicBoolean myShown = new AtomicBoolean(false); @NotNull private static Project getProject(@Nullable Project project) { @@ -241,23 +242,26 @@ public class ShowSettingsUtilImpl extends ShowSettingsUtil { } @Override - public boolean editConfigurable(Component parent, Configurable configurable) { + public boolean editConfigurable(@Nullable Component parent, @NotNull Configurable configurable) { return editConfigurable(parent, configurable, null); } @Override - public boolean editConfigurable(final Component parent, final Configurable configurable, @Nullable final Runnable advancedInitialization) { + public boolean editConfigurable(@Nullable Component parent, @NotNull Configurable configurable, @Nullable Runnable advancedInitialization) { return editConfigurable(parent, null, configurable, createDimensionKey(configurable), advancedInitialization); } - private static boolean editConfigurable(final @Nullable Component parent, @Nullable Project project, final Configurable configurable, final String dimensionKey, + private static boolean editConfigurable(@Nullable Component parent, + @Nullable Project project, + @NotNull Configurable configurable, + String dimensionKey, @Nullable final Runnable advancedInitialization) { SingleConfigurableEditor editor; - if (parent != null) { - editor = new SingleConfigurableEditor(parent, configurable, dimensionKey); + if (parent == null) { + editor = new SingleConfigurableEditor(project, configurable, dimensionKey); } else { - editor = new SingleConfigurableEditor(project, configurable, dimensionKey); + editor = new SingleConfigurableEditor(parent, configurable, dimensionKey); } if (advancedInitialization != null) { new UiNotifyConnector.Once(editor.getContentPane(), new Activatable.Adapter() { @@ -271,10 +275,9 @@ public class ShowSettingsUtilImpl extends ShowSettingsUtil { return editor.isOK(); } - public static String createDimensionKey(Configurable configurable) { - String displayName = configurable.getDisplayName(); - displayName = displayName.replaceAll("\n", "_").replaceAll(" ", "_"); - return "#" + displayName; + @NotNull + public static String createDimensionKey(@NotNull Configurable configurable) { + return '#' + StringUtil.replaceChar(StringUtil.replaceChar(configurable.getDisplayName(), '\n', '_'), ' ', '_'); } @Override From 337d948265c3d5c3599155a10eed6e4b9b8a8dab Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 25 Aug 2014 13:14:11 +0200 Subject: [PATCH 39/97] cleanup --- .../diagnostic/ErrorReportConfigurable.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/diagnostic/ErrorReportConfigurable.java b/platform/platform-impl/src/com/intellij/diagnostic/ErrorReportConfigurable.java index 7d5688c9d1d8..835c45367c93 100644 --- a/platform/platform-impl/src/com/intellij/diagnostic/ErrorReportConfigurable.java +++ b/platform/platform-impl/src/com/intellij/diagnostic/ErrorReportConfigurable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,13 +25,6 @@ import org.apache.commons.codec.binary.Base64; import org.jdom.Element; import org.jetbrains.annotations.NotNull; -/** - * Created by IntelliJ IDEA. - * User: stathik - * Date: Aug 11, 2003 - * Time: 8:59:04 PM - * To change this template use Options | File Templates. - */ public class ErrorReportConfigurable implements JDOMExternalizable, NamedComponent { public String ITN_LOGIN = ""; public String ITN_PASSWORD_CRYPT = ""; @@ -43,12 +36,14 @@ public class ErrorReportConfigurable implements JDOMExternalizable, NamedCompone return ServiceManager.getService(ErrorReportConfigurable.class); } + @Override public void readExternal(Element element) throws InvalidDataException { DefaultJDOMExternalizer.readExternal(this, element); if (! KEEP_ITN_PASSWORD) ITN_PASSWORD_CRYPT = ""; } + @Override public void writeExternal(Element element) throws WriteExternalException { String itnPassword = ITN_PASSWORD_CRYPT; if (! KEEP_ITN_PASSWORD) @@ -58,13 +53,14 @@ public class ErrorReportConfigurable implements JDOMExternalizable, NamedCompone ITN_PASSWORD_CRYPT = itnPassword; } + @Override @NotNull public String getComponentName() { return "ErrorReportConfigurable"; } public String getPlainItnPassword () { - return new String(new Base64().decode(ErrorReportConfigurable.getInstance().ITN_PASSWORD_CRYPT.getBytes())); + return new String(new Base64().decode(getInstance().ITN_PASSWORD_CRYPT.getBytes())); } public void setPlainItnPassword (String password) { From 104fe76911476b47f861ca38547a677713df9132 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 25 Aug 2014 13:44:39 +0200 Subject: [PATCH 40/97] use our util Base64 platform-api doesn't export commons codec dependency --- platform/platform-api/platform-api.iml | 2 +- .../diagnostic/ErrorReportConfigurable.java | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/platform/platform-api/platform-api.iml b/platform/platform-api/platform-api.iml index 127cfb114b38..38016f147d1a 100644 --- a/platform/platform-api/platform-api.iml +++ b/platform/platform-api/platform-api.iml @@ -14,7 +14,7 @@ - + diff --git a/platform/platform-impl/src/com/intellij/diagnostic/ErrorReportConfigurable.java b/platform/platform-impl/src/com/intellij/diagnostic/ErrorReportConfigurable.java index 835c45367c93..3f865dd19abd 100644 --- a/platform/platform-impl/src/com/intellij/diagnostic/ErrorReportConfigurable.java +++ b/platform/platform-impl/src/com/intellij/diagnostic/ErrorReportConfigurable.java @@ -21,7 +21,8 @@ import com.intellij.openapi.util.DefaultJDOMExternalizer; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.JDOMExternalizable; import com.intellij.openapi.util.WriteExternalException; -import org.apache.commons.codec.binary.Base64; +import com.intellij.openapi.vfs.CharsetToolkit; +import com.intellij.util.Base64; import org.jdom.Element; import org.jetbrains.annotations.NotNull; @@ -39,15 +40,17 @@ public class ErrorReportConfigurable implements JDOMExternalizable, NamedCompone @Override public void readExternal(Element element) throws InvalidDataException { DefaultJDOMExternalizer.readExternal(this, element); - if (! KEEP_ITN_PASSWORD) + if (!KEEP_ITN_PASSWORD) { ITN_PASSWORD_CRYPT = ""; + } } @Override public void writeExternal(Element element) throws WriteExternalException { String itnPassword = ITN_PASSWORD_CRYPT; - if (! KEEP_ITN_PASSWORD) + if (!KEEP_ITN_PASSWORD) { ITN_PASSWORD_CRYPT = ""; + } DefaultJDOMExternalizer.writeExternal(this, element); ITN_PASSWORD_CRYPT = itnPassword; @@ -59,11 +62,11 @@ public class ErrorReportConfigurable implements JDOMExternalizable, NamedCompone return "ErrorReportConfigurable"; } - public String getPlainItnPassword () { - return new String(new Base64().decode(getInstance().ITN_PASSWORD_CRYPT.getBytes())); + public String getPlainItnPassword() { + return new String(Base64.decode(getInstance().ITN_PASSWORD_CRYPT), CharsetToolkit.UTF8_CHARSET); } - public void setPlainItnPassword (String password) { - ITN_PASSWORD_CRYPT = new String(new Base64().encode(password.getBytes())); + public void setPlainItnPassword(String password) { + ITN_PASSWORD_CRYPT = Base64.encode(password.getBytes(CharsetToolkit.UTF8_CHARSET)); } } From 9e4045461752e05ad56c0f2595fc12c9b864f30c Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 25 Aug 2014 14:46:26 +0400 Subject: [PATCH 41/97] automatic constructor params rename: detect variable kind if possible to correctly process code style prefixes (IDEA-128960) --- .../naming/ConstructorParameterOnFieldRenameRenamer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/refactoring/rename/naming/ConstructorParameterOnFieldRenameRenamer.java b/java/java-impl/src/com/intellij/refactoring/rename/naming/ConstructorParameterOnFieldRenameRenamer.java index 345b3129defb..67bb13ce81e4 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/naming/ConstructorParameterOnFieldRenameRenamer.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/naming/ConstructorParameterOnFieldRenameRenamer.java @@ -36,7 +36,9 @@ public class ConstructorParameterOnFieldRenameRenamer extends AutomaticRenamer { } protected String nameToCanonicalName(@NonNls final String name, final PsiNamedElement element) { - return JavaCodeStyleManager.getInstance(element.getProject()).variableNameToPropertyName(name, VariableKind.FIELD); + final JavaCodeStyleManager javaCodeStyleManager = JavaCodeStyleManager.getInstance(element.getProject()); + final VariableKind variableKind = element instanceof PsiVariable ? javaCodeStyleManager.getVariableKind((PsiVariable)element) : VariableKind.FIELD; + return javaCodeStyleManager.variableNameToPropertyName(name, variableKind); } public ConstructorParameterOnFieldRenameRenamer(PsiField aField, String newFieldName) { From 7d5a8366b9c9c3b41d31b67523ecbe40e90bec47 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 25 Aug 2014 15:04:50 +0400 Subject: [PATCH 42/97] create test: override template defined superclass with selection from dialog (IDEA-128995) --- .../createTest/JavaTestGenerator.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/testIntegration/createTest/JavaTestGenerator.java b/java/java-impl/src/com/intellij/testIntegration/createTest/JavaTestGenerator.java index abde9233f535..fd96a06d6cd4 100644 --- a/java/java-impl/src/com/intellij/testIntegration/createTest/JavaTestGenerator.java +++ b/java/java-impl/src/com/intellij/testIntegration/createTest/JavaTestGenerator.java @@ -28,6 +28,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.ex.IdeDocumentHistory; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; @@ -63,12 +64,17 @@ public class JavaTestGenerator implements TestGenerator { if (targetClass == null) { return null; } - addSuperClass(targetClass, project, d.getSuperClassName()); + final TestFramework frameworkDescriptor = d.getSelectedTestFrameworkDescriptor(); + final String defaultSuperClass = frameworkDescriptor.getDefaultSuperClass(); + final String superClassName = d.getSuperClassName(); + if (!Comparing.strEqual(superClassName, defaultSuperClass)) { + addSuperClass(targetClass, project, superClassName); + } Editor editor = CodeInsightUtil.positionCursor(project, targetClass.getContainingFile(), targetClass.getLBrace()); addTestMethods(editor, targetClass, - d.getSelectedTestFrameworkDescriptor(), + frameworkDescriptor, d.getSelectedMethods(), d.shouldGeneratedBefore(), d.shouldGeneratedAfter()); @@ -135,7 +141,7 @@ public class JavaTestGenerator implements TestGenerator { private static void addSuperClass(PsiClass targetClass, Project project, String superClassName) throws IncorrectOperationException { if (superClassName == null) return; final PsiReferenceList extendsList = targetClass.getExtendsList(); - if (extendsList == null || extendsList.getReferencedTypes().length > 0) return; + if (extendsList == null) return; PsiElementFactory ef = JavaPsiFacade.getInstance(project).getElementFactory(); PsiJavaCodeReferenceElement superClassRef; @@ -147,7 +153,12 @@ public class JavaTestGenerator implements TestGenerator { else { superClassRef = ef.createFQClassNameReferenceElement(superClassName, GlobalSearchScope.allScope(project)); } - extendsList.add(superClassRef); + final PsiJavaCodeReferenceElement[] referenceElements = extendsList.getReferenceElements(); + if (referenceElements.length == 0) { + extendsList.add(superClassRef); + } else { + referenceElements[0].replace(superClassRef); + } } @Nullable From 7c19db48498db691bcc7eca661930805d72075a6 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Mon, 25 Aug 2014 16:23:38 +0400 Subject: [PATCH 43/97] fix concurrency issues in PostprocessReformattingAspect --- .../source/PostprocessReformattingAspect.java | 61 +++++++++++-------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java b/platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java index c5b183c3594b..f99d47201a20 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java @@ -56,20 +56,22 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.TestOnly; import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; public class PostprocessReformattingAspect implements PomModelAspect { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.PostprocessReformattingAspect"); private final Project myProject; private final PsiManager myPsiManager; private final TreeAspect myTreeAspect; - private final Map> myReformatElements = new HashMap>(); - private volatile int myDisabledCounter = 0; - private final Set myUpdatedProviders = new HashSet(); - private final AtomicInteger myPostponedCounter = new AtomicInteger(); private static final Key REFORMAT_ORIGINATOR = Key.create("REFORMAT_ORIGINATOR"); private static final boolean STORE_REFORMAT_ORIGINATOR_STACKTRACE = ApplicationManager.getApplication().isInternal(); + private final ThreadLocal myContext = new ThreadLocal() { + @Override + protected Context initialValue() { + return new Context(); + } + }; + public PostprocessReformattingAspect(Project project, PsiManager psiManager, TreeAspect treeAspect,final CommandProcessor processor) { myProject = project; myPsiManager = psiManager; @@ -113,12 +115,12 @@ public class PostprocessReformattingAspect implements PomModelAspect { public T disablePostprocessFormattingInside(@NotNull Computable computable) { try { - myDisabledCounter++; + getContext().myDisabledCounter++; return computable.compute(); } finally { - myDisabledCounter--; - LOG.assertTrue(myDisabledCounter > 0 || !isDisabled()); + getContext().myDisabledCounter--; + LOG.assertTrue(getContext().myDisabledCounter > 0 || !isDisabled()); } } @@ -145,13 +147,13 @@ public class PostprocessReformattingAspect implements PomModelAspect { } private void incrementPostponedCounter() { - myPostponedCounter.incrementAndGet(); + getContext().myPostponedCounter++; } private void decrementPostponedCounter() { Application application = ApplicationManager.getApplication(); application.assertIsDispatchThread(); - if (myPostponedCounter.decrementAndGet() == 0) { + if (--getContext().myPostponedCounter == 0) { if (application.isWriteAccessAllowed()) { doPostponedFormatting(); } @@ -175,7 +177,7 @@ public class PostprocessReformattingAspect implements PomModelAspect { atomic(new Runnable() { @Override public void run() { - if (isDisabled() || myPostponedCounter.get() == 0 && !ApplicationManager.getApplication().isUnitTestMode()) return; + if (isDisabled() || getContext().myPostponedCounter == 0 && !ApplicationManager.getApplication().isUnitTestMode()) return; final TreeChangeEvent changeSet = (TreeChangeEvent)event.getChangeSet(myTreeAspect); if (changeSet == null) return; final PsiElement psiElement = changeSet.getRootElement().getPsi(); @@ -184,7 +186,7 @@ public class PostprocessReformattingAspect implements PomModelAspect { final FileViewProvider viewProvider = containingFile.getViewProvider(); if (!viewProvider.isEventSystemEnabled()) return; - myUpdatedProviders.add(viewProvider); + getContext().myUpdatedProviders.add(viewProvider); for (final ASTNode node : changeSet.getChangedElements()) { final TreeChange treeChange = changeSet.getChangesByElement(node); for (final ASTNode affectedChild : treeChange.getAffectedChildren()) { @@ -221,7 +223,7 @@ public class PostprocessReformattingAspect implements PomModelAspect { public void run() { if (isDisabled()) return; try { - FileViewProvider[] viewProviders = myUpdatedProviders.toArray(new FileViewProvider[myUpdatedProviders.size()]); + FileViewProvider[] viewProviders = getContext().myUpdatedProviders.toArray(new FileViewProvider[getContext().myUpdatedProviders.size()]); for (final FileViewProvider viewProvider : viewProviders) { doPostponedFormatting(viewProvider); } @@ -230,7 +232,7 @@ public class PostprocessReformattingAspect implements PomModelAspect { LOG.error(e); } finally { - LOG.assertTrue(myReformatElements.isEmpty(), myReformatElements); + LOG.assertTrue(getContext().myReformatElements.isEmpty(), getContext().myReformatElements); } } }); @@ -248,7 +250,7 @@ public class PostprocessReformattingAspect implements PomModelAspect { atomic(new Runnable() { @Override public void run() { - if (isDisabled() || check && !myUpdatedProviders.contains(viewProvider)) return; + if (isDisabled() || check && !getContext().myUpdatedProviders.contains(viewProvider)) return; try { disablePostprocessFormattingInside(new Runnable() { @@ -259,8 +261,8 @@ public class PostprocessReformattingAspect implements PomModelAspect { }); } finally { - myUpdatedProviders.remove(viewProvider); - myReformatElements.remove(viewProvider); + getContext().myUpdatedProviders.remove(viewProvider); + getContext().myReformatElements.remove(viewProvider); viewProvider.putUserData(REFORMAT_ORIGINATOR, null); } } @@ -268,7 +270,7 @@ public class PostprocessReformattingAspect implements PomModelAspect { } public boolean isViewProviderLocked(@NotNull FileViewProvider fileViewProvider) { - return myReformatElements.containsKey(fileViewProvider); + return getContext().myReformatElements.containsKey(fileViewProvider); } public void beforeDocumentChanged(@NotNull FileViewProvider viewProvider) { @@ -292,10 +294,10 @@ public class PostprocessReformattingAspect implements PomModelAspect { LOG.assertTrue(oldIndent >= 0, "for not generated items old indentation must be defined: element=" + child + ", text=" + child.getText()); } - List list = myReformatElements.get(viewProvider); + List list = getContext().myReformatElements.get(viewProvider); if (list == null) { list = new ArrayList(); - myReformatElements.put(viewProvider, list); + getContext().myReformatElements.put(viewProvider, list); if (STORE_REFORMAT_ORIGINATOR_STACKTRACE) { viewProvider.putUserData(REFORMAT_ORIGINATOR, new Throwable()); } @@ -304,7 +306,7 @@ public class PostprocessReformattingAspect implements PomModelAspect { } private void doPostponedFormattingInner(@NotNull FileViewProvider key) { - final List astNodes = myReformatElements.remove(key); + final List astNodes = getContext().myReformatElements.remove(key); final Document document = key.getDocument(); // Sort ranges by end offsets so that we won't need any offset adjustment after reformat or reindent if (document == null) return; @@ -370,7 +372,7 @@ public class PostprocessReformattingAspect implements PomModelAspect { String expectedPsi = treeDebugBuilder.psiToString(psi); if (!expectedPsi.equals(actualPsiTree)) { - myReformatElements.clear(); + getContext().myReformatElements.clear(); assert expectedPsi.equals(actualPsiTree) : "Refactored psi should be the same as result of parsing"; } } @@ -627,7 +629,7 @@ public class PostprocessReformattingAspect implements PomModelAspect { } public boolean isDisabled() { - return myDisabledCounter > 0; + return getContext().myDisabledCounter > 0; } @NotNull @@ -769,6 +771,17 @@ public class PostprocessReformattingAspect implements PomModelAspect { @TestOnly public void clear() { - myReformatElements.clear(); + getContext().myReformatElements.clear(); + } + + private Context getContext() { + return myContext.get(); + } + + private static class Context { + private int myPostponedCounter = 0; + private int myDisabledCounter = 0; + private final Set myUpdatedProviders = new HashSet(); + private final Map> myReformatElements = new HashMap>(); } } From 551fa58b62bbd46d39b79388fde1cf063ec7335b Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Mon, 25 Aug 2014 17:16:07 +0400 Subject: [PATCH 44/97] IDEA-128336 / 1.3 / sort configurables at the default view according to the tree --- .../options/newEditor/OptionsEditor.java | 11 ++++- .../options/newEditor/SettingsTreeView.java | 42 +++++++++++-------- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java index e1c8e34077a9..55e254d026fa 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java @@ -1205,7 +1205,16 @@ public class OptionsEditor extends JPanel implements DataProvider, Place.Navigat if (searchable instanceof Configurable.Composite) { box.add(Box.createVerticalStrut(10)); Configurable.Composite composite = (Configurable.Composite)searchable; - for (final Configurable configurable : composite.getConfigurables()) { + Configurable[] configurables = composite.getConfigurables(); + if (myTreeView != null) { + Arrays.sort(configurables, new Comparator() { + @Override + public int compare(Configurable configurable1, Configurable configurable2) { + return myTreeView.compareConfigurables(configurable1, configurable2); + } + }); + } + for (final Configurable configurable : configurables) { box.add(new LinkLabel(configurable.getDisplayName(), AllIcons.Ide.Link) { @Override public void doClick() { diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java index 44976041dc1b..16758fc11df4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java @@ -858,24 +858,30 @@ final class SettingsTreeView extends JComponent implements Disposable, OptionsEd private static final Comparator COMPARATOR = new Comparator() { @Override public int compare(NodeDescriptor descriptor1, NodeDescriptor descriptor2) { - MyNode node1 = extractNode(descriptor1); - MyNode node2 = extractNode(descriptor2); - if (node1 == null || node2 == null) { - return node2 != null ? -1 : node1 != null ? 1 : 0; - } - int weight1 = node1.getWeight(); - int weight2 = node2.getWeight(); - - if (weight1 > weight2) { - return -1; - } - if (weight1 < weight2) { - return 1; - } - if (weight1 == Integer.MIN_VALUE) { - return 0; // do not sort if undefined weight - } - return StringUtil.naturalCompare(node1.myDisplayName, node2.myDisplayName); + return compareNodes(extractNode(descriptor1), extractNode(descriptor2)); } }; + + int compareConfigurables(Configurable configurable1, Configurable configurable2) { + return compareNodes(myConfigurableToNodeMap.get(configurable1), myConfigurableToNodeMap.get(configurable2)); + } + + private static int compareNodes(MyNode node1, MyNode node2) { + if (node1 == null || node2 == null) { + return node2 != null ? -1 : node1 != null ? 1 : 0; + } + int weight1 = node1.getWeight(); + int weight2 = node2.getWeight(); + + if (weight1 > weight2) { + return -1; + } + if (weight1 < weight2) { + return 1; + } + if (weight1 == Integer.MIN_VALUE) { + return 0; // do not sort if undefined weight + } + return StringUtil.naturalCompare(node1.myDisplayName, node2.myDisplayName); + } } From 901812b6c5b45b23857f8bacfbc49c513e5aa582 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 15:44:53 +0200 Subject: [PATCH 45/97] fix switching from/to Darcula --- .../src/com/intellij/ui/HyperlinkLabel.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java b/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java index 27324c9d9781..1f375ed799eb 100644 --- a/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java +++ b/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,9 +20,11 @@ import com.intellij.ide.BrowserUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.markup.EffectType; import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.util.NotNullProducer; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.PlatformColors; import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -42,7 +44,13 @@ import java.util.List; * @author Eugene Belyaev */ public class HyperlinkLabel extends HighlightableComponent { - private static final TextAttributes BOLD_ATTRIBUTES = new TextAttributes(UIUtil.getLabelTextForeground(), null, null, null, Font.BOLD); + private static final TextAttributes BOLD_ATTRIBUTES = new TextAttributes(new JBColor(new NotNullProducer() { + @NotNull + @Override + public Color produce() { + return UIUtil.getLabelTextForeground(); + } + }), null, null, null, Font.BOLD); private static final Logger LOG = Logger.getInstance(HyperlinkLabel.class.getName()); @@ -59,7 +67,13 @@ public class HyperlinkLabel extends HighlightableComponent { public HyperlinkLabel(String text) { this(text, PlatformColors.BLUE, - UIUtil.getLabelBackground(), + new JBColor(new NotNullProducer() { + @NotNull + @Override + public Color produce() { + return UIUtil.getLabelBackground(); + } + }), PlatformColors.BLUE); } From f239a7732e99adcfedfab31d55845298e8972607 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 16:01:34 +0200 Subject: [PATCH 46/97] content doesn't change if container size doesn't change --- platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java b/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java index 1f375ed799eb..81c545561bec 100644 --- a/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java +++ b/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java @@ -223,7 +223,9 @@ public class HyperlinkLabel extends HighlightableComponent { LOG.error(e); } highlightedText.applyToComponent(this); - ((JComponent)getParent()).revalidate(); + final JComponent parent = (JComponent)getParent(); + parent.revalidate(); + parent.repaint(); adjustSize(); } From 1b5243d9f834587df6c4793fefa8b23058e70a3a Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 16:04:52 +0200 Subject: [PATCH 47/97] clean up. remove duplicates --- .../ide/actions/ShowSettingsUtilImpl.java | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.java b/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.java index e901b1b32875..11aa2a353ba6 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.java @@ -15,6 +15,8 @@ */ package com.intellij.ide.actions; +import com.intellij.ide.ui.search.SearchUtil; +import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurableGroup; @@ -51,7 +53,7 @@ public class ShowSettingsUtilImpl extends ShowSettingsUtil { } @NotNull - private static DialogWrapper getDialog(@Nullable Project project, @NotNull ConfigurableGroup[] groups, @Nullable Configurable toSelect) { + public static DialogWrapper getDialog(@Nullable Project project, @NotNull ConfigurableGroup[] groups, @Nullable Configurable toSelect) { return Registry.is("ide.perProjectModality") ? new OptionsEditorDialog(getProject(project), filterEmptyGroups(groups), toSelect, true) : new OptionsEditorDialog(getProject(project), filterEmptyGroups(groups), toSelect); @@ -133,20 +135,20 @@ public class ShowSettingsUtilImpl extends ShowSettingsUtil { @Override public void showSettingsDialog(@Nullable final Project project, @NotNull final String nameToSelect) { - ConfigurableGroup[] group = getConfigurableGroups(project, true); - + ConfigurableGroup[] groups = getConfigurableGroups(project, true); Project actualProject = getProject(project); - group = filterEmptyGroups(group); + groups = filterEmptyGroups(groups); + getDialog(actualProject, groups, findPreselectedByDisplayName(nameToSelect, groups)).show(); + } - OptionsEditorDialog dialog; - if (Registry.is("ide.perProjectModality")) { - dialog = new OptionsEditorDialog(actualProject, group, nameToSelect, true); + @Nullable + private static Configurable findPreselectedByDisplayName(final String preselectedConfigurableDisplayName, ConfigurableGroup[] groups) { + final List all = SearchUtil.expand(groups); + for (Configurable each : all) { + if (preselectedConfigurableDisplayName.equals(each.getDisplayName())) return each; } - else { - dialog = new OptionsEditorDialog(actualProject, group, nameToSelect); - } - dialog.show(); + return null; } public static void showSettingsDialog(@Nullable Project project, final String id2Select, final String filter) { @@ -157,17 +159,12 @@ public class ShowSettingsUtilImpl extends ShowSettingsUtil { group = filterEmptyGroups(group); final Configurable configurable2Select = findConfigurable2Select(id2Select, group); - final OptionsEditorDialog dialog; - if (Registry.is("ide.perProjectModality")) { - dialog = new OptionsEditorDialog(actualProject, group, configurable2Select, true); - } else { - dialog = new OptionsEditorDialog(actualProject, group, configurable2Select); - } + final DialogWrapper dialog = getDialog(project, group, configurable2Select); new UiNotifyConnector.Once(dialog.getContentPane(), new Activatable.Adapter() { @Override public void showNotify() { - final OptionsEditor editor = (OptionsEditor)dialog.getData(OptionsEditor.KEY.getName()); + final OptionsEditor editor = (OptionsEditor)((DataProvider)dialog).getData(OptionsEditor.KEY.getName()); LOG.assertTrue(editor != null); editor.select(configurable2Select, filter); } From 1ae738f0f1ef7c863d93d3a41f26e2b6c634aca3 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 16:13:40 +0200 Subject: [PATCH 48/97] fix assertion --- platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java b/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java index 81c545561bec..6a99624a620b 100644 --- a/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java +++ b/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java @@ -48,7 +48,8 @@ public class HyperlinkLabel extends HighlightableComponent { @NotNull @Override public Color produce() { - return UIUtil.getLabelTextForeground(); + final Color foreground = UIUtil.getLabelTextForeground(); + return foreground == null ? UIUtil.getLabelForeground() : foreground; } }), null, null, null, Font.BOLD); From a41d99315bbea605544123e13abb2ef362553671 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 16:15:44 +0200 Subject: [PATCH 49/97] clone OptionsEditorDialog --- .../ide/actions/ShowSettingsUtilImpl.java | 10 +- .../options/newEditor/IdeSettingsDialog.java | 301 ++++++++++++++++++ 2 files changed, 309 insertions(+), 2 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java diff --git a/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.java b/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.java index 11aa2a353ba6..db7b289eb354 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/ShowSettingsUtilImpl.java @@ -23,6 +23,7 @@ import com.intellij.openapi.options.ConfigurableGroup; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.options.ex.*; +import com.intellij.openapi.options.newEditor.IdeSettingsDialog; import com.intellij.openapi.options.newEditor.OptionsEditor; import com.intellij.openapi.options.newEditor.OptionsEditorDialog; import com.intellij.openapi.project.Project; @@ -54,9 +55,14 @@ public class ShowSettingsUtilImpl extends ShowSettingsUtil { @NotNull public static DialogWrapper getDialog(@Nullable Project project, @NotNull ConfigurableGroup[] groups, @Nullable Configurable toSelect) { + project = getProject(project); + final ConfigurableGroup[] filteredGroups = filterEmptyGroups(groups); + if (Registry.is("ide.new.settings.dialog")) { + return new IdeSettingsDialog(project, filteredGroups, toSelect); + } return Registry.is("ide.perProjectModality") - ? new OptionsEditorDialog(getProject(project), filterEmptyGroups(groups), toSelect, true) - : new OptionsEditorDialog(getProject(project), filterEmptyGroups(groups), toSelect); + ? new OptionsEditorDialog(project, filteredGroups, toSelect, true) + : new OptionsEditorDialog(project, filteredGroups, toSelect); } @NotNull diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java new file mode 100644 index 000000000000..26ce696530c8 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java @@ -0,0 +1,301 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.options.newEditor; + +import com.intellij.CommonBundle; +import com.intellij.ide.ui.search.SearchUtil; +import com.intellij.ide.util.PropertiesComponent; +import com.intellij.openapi.actionSystem.DataProvider; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.help.HelpManager; +import com.intellij.openapi.options.Configurable; +import com.intellij.openapi.options.ConfigurableGroup; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.options.SearchableConfigurable; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.util.ActionCallback; +import com.intellij.openapi.util.Disposer; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.KeyEvent; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * @author Konstantin Bulenkov + */ +public class IdeSettingsDialog extends DialogWrapper implements DataProvider { + private Project myProject; + private ConfigurableGroup[] myGroups; + private Configurable myPreselected; + private OptionsEditor myEditor; + + private ApplyAction myApplyAction; + public static final String DIMENSION_KEY = "OptionsEditor"; + @NonNls static final String LAST_SELECTED_CONFIGURABLE = "options.lastSelected"; + + /** This constructor should be eliminated after the new modality approach + * will have been checked. See a {@code Registry} key ide.perProjectModality + * @deprecated + */ + public IdeSettingsDialog(Project project, ConfigurableGroup[] groups, + @Nullable Configurable preselectedConfigurable, boolean applicationModalIfPossible) { + super(project, true, applicationModalIfPossible); + init(project, groups, preselectedConfigurable != null ? preselectedConfigurable : findLastSavedConfigurable(groups, project)); + } + + /** This constructor should be eliminated after the new modality approach + * will have been checked. See a {@code Registry} key ide.perProjectModality + * @deprecated + */ + public IdeSettingsDialog(Project project, ConfigurableGroup[] groups, + @NotNull String preselectedConfigurableDisplayName, boolean applicationModalIfPossible) { + super(project, true, applicationModalIfPossible); + init(project, groups, getPreselectedByDisplayName(groups, preselectedConfigurableDisplayName, project)); + } + + public IdeSettingsDialog(Project project, ConfigurableGroup[] groups, @Nullable Configurable preselectedConfigurable) { + super(project, true); + init(project, groups, preselectedConfigurable != null ? preselectedConfigurable : findLastSavedConfigurable(groups, project)); + } + + public IdeSettingsDialog(Project project, ConfigurableGroup[] groups, @NotNull String preselectedConfigurableDisplayName) { + super(project, true); + init(project, groups, getPreselectedByDisplayName(groups, preselectedConfigurableDisplayName, project)); + } + + private void init(final Project project, final ConfigurableGroup[] groups, @Nullable final Configurable preselected) { + myProject = project; + myGroups = groups; + myPreselected = preselected; + + setTitle(CommonBundle.settingsTitle()); + + init(); + } + + @Nullable + private static Configurable getPreselectedByDisplayName(final ConfigurableGroup[] groups, final String preselectedConfigurableDisplayName, + final Project project) { + Configurable result = findPreselectedByDisplayName(preselectedConfigurableDisplayName, groups); + + return result == null ? findLastSavedConfigurable(groups, project) : result; + } + + @Override + public boolean isTypeAheadEnabled() { + return true; + } + + protected JComponent createCenterPanel() { + myEditor = new OptionsEditor(myProject, myGroups, myPreselected); + myEditor.getContext().addColleague(new OptionsEditorColleague.Adapter() { + @Override + public ActionCallback onModifiedAdded(final Configurable configurable) { + updateStatus(); + return new ActionCallback.Done(); + } + + @Override + public ActionCallback onModifiedRemoved(final Configurable configurable) { + updateStatus(); + return new ActionCallback.Done(); + } + + @Override + public ActionCallback onErrorsChanged() { + updateStatus(); + return new ActionCallback.Done(); + } + }); + Disposer.register(myDisposable, myEditor); + return myEditor; + } + + public boolean updateStatus() { + myApplyAction.setEnabled(myEditor.canApply()); + + final Map errors = myEditor.getContext().getErrors(); + if (errors.size() == 0) { + setErrorText(null); + } else { + String text = "Changes were not applied because of an error"; + + final String errorMessage = getErrorMessage(errors); + if (errorMessage != null) { + text += "
" + errorMessage; + } + + setErrorText(text); + } + + return errors.size() == 0; + } + + @Nullable + private static String getErrorMessage(final Map errors) { + final Collection values = errors.values(); + final ConfigurationException[] exceptions = values.toArray(new ConfigurationException[values.size()]); + if (exceptions.length > 0) { + return exceptions[0].getMessage(); + } + return null; + } + + @Override + protected String getDimensionServiceKey() { + return DIMENSION_KEY; + } + + @Override + protected void doOKAction() { + myEditor.flushModifications(); + + if (myEditor.canApply()) { + myEditor.apply(); + if (!updateStatus()) return; + } + + saveCurrentConfigurable(); + + ApplicationManager.getApplication().saveAll(); + + super.doOKAction(); + } + + + private void saveCurrentConfigurable() { + final Configurable current = myEditor.getContext().getCurrentConfigurable(); + if (current == null) return; + + final PropertiesComponent props = PropertiesComponent.getInstance(myProject); + + if (current instanceof SearchableConfigurable) { + props.setValue(LAST_SELECTED_CONFIGURABLE, ((SearchableConfigurable)current).getId()); + } else { + props.setValue(LAST_SELECTED_CONFIGURABLE, current.getClass().getName()); + } + } + + @Nullable + private static Configurable findLastSavedConfigurable(ConfigurableGroup[] groups, final Project project) { + final String id = PropertiesComponent.getInstance(project).getValue(LAST_SELECTED_CONFIGURABLE); + if (id == null) return null; + + return findConfigurableInGroups(id, groups); + } + + @Nullable + private static Configurable findConfigurableInGroups(String id, Configurable.Composite... groups) { + // avoid unnecessary group expand: check top-level configurables in all groups before looking at children + for (Configurable.Composite group : groups) { + final Configurable[] configurables = group.getConfigurables(); + for (Configurable c : configurables) { + if (c instanceof SearchableConfigurable && id.equals(((SearchableConfigurable)c).getId())) { + return c; + } else if (id.equals(c.getClass().getName())) { + return c; + } + } + } + for (Configurable.Composite group : groups) { + final Configurable[] configurables = group.getConfigurables(); + for (Configurable c : configurables) { + if (c instanceof Configurable.Composite) { + Configurable result = findConfigurableInGroups(id, (Configurable.Composite)c); + if (result != null) { + return result; + } + } + } + } + return null; + } + + @Nullable + private static Configurable findPreselectedByDisplayName(final String preselectedConfigurableDisplayName, ConfigurableGroup[] groups) { + final List all = SearchUtil.expand(groups); + for (Configurable each : all) { + if (preselectedConfigurableDisplayName.equals(each.getDisplayName())) return each; + } + return null; + } + + @Override + public void doCancelAction(final AWTEvent source) { + if (source instanceof KeyEvent || source instanceof ActionEvent) { + if (myEditor.getContext().isHoldingFilter()) { + myEditor.clearFilter(); + return; + } + } + + super.doCancelAction(source); + } + + @Override + public void doCancelAction() { + saveCurrentConfigurable(); + super.doCancelAction(); + } + + @NotNull + @Override + protected Action[] createActions() { + myApplyAction = new ApplyAction(); + return new Action[] {getOKAction(), getCancelAction(), myApplyAction, getHelpAction()}; + } + + @Override + protected void doHelpAction() { + final String topic = myEditor.getHelpTopic(); + if (topic != null) { + HelpManager.getInstance().invokeHelp(topic); + } + } + + @Override + public JComponent getPreferredFocusedComponent() { + return myEditor.getPreferredFocusedComponent(); + } + + public Object getData(@NonNls String dataId) { + if (OptionsEditor.KEY.is(dataId)) { + return myEditor; + } + return null; + } + + private class ApplyAction extends AbstractAction { + public ApplyAction() { + super(CommonBundle.getApplyButtonText()); + setEnabled(false); + } + + public void actionPerformed(final ActionEvent e) { + myEditor.apply(); + myEditor.revalidate(); + myEditor.repaint(); + } + } +} From f7cbac4dd44b850065563586b33a050f5d18aceb Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Mon, 25 Aug 2014 18:23:04 +0400 Subject: [PATCH 50/97] CPP-565 CLion Welcome Screen Toolchains step --- .../src/com/intellij/ide/customize/CustomizeIDEWizardDialog.java | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/platform-impl/src/com/intellij/ide/customize/CustomizeIDEWizardDialog.java b/platform/platform-impl/src/com/intellij/ide/customize/CustomizeIDEWizardDialog.java index be37f9d9d7f6..7a1ea924e0b8 100644 --- a/platform/platform-impl/src/com/intellij/ide/customize/CustomizeIDEWizardDialog.java +++ b/platform/platform-impl/src/com/intellij/ide/customize/CustomizeIDEWizardDialog.java @@ -51,6 +51,7 @@ public class CustomizeIDEWizardDialog extends DialogWrapper implements ActionLis public CustomizeIDEWizardDialog() { super(null, true, true); setTitle("Customize " + ApplicationNamesInfo.getInstance().getProductName()); + getPeer().setAppIcons(); initSteps(); mySkipButton.addActionListener(this); myBackButton.addActionListener(this); From 2958a1749839b44e87921f20a0d0e6c138f1ecc2 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 25 Aug 2014 16:45:54 +0400 Subject: [PATCH 51/97] documentation link navigation: ask all documentation providers if current can't answer (IDEA-115387) --- .../documentation/DocumentationManager.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java index c6d0618a1f2b..d4a64ab794c4 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java @@ -39,6 +39,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.OrderEntry; @@ -847,7 +848,15 @@ public class DocumentationManager extends DockablePopupManager Date: Mon, 25 Aug 2014 18:21:08 +0400 Subject: [PATCH 52/97] todo by scopes: reuse scope chooser combo, exclude ClassHierarchy (place to clear inner cache?) (IDEA-126228) --- .../HierarchyScopeDescriptorProvider.java | 6 + .../ide/todo/ScopeBasedTodosPanel.java | 129 ++---------------- .../ide/todo/ScopeBasedTodosTreeBuilder.java | 5 +- .../todo/ScopeBasedTodosTreeStructure.java | 25 +--- .../util/scopeChooser/ScopeChooserCombo.java | 12 +- .../scopeChooser/ScopeDescriptorProvider.java | 1 + 6 files changed, 38 insertions(+), 140 deletions(-) diff --git a/java/java-impl/src/com/intellij/ide/util/scopeChooser/HierarchyScopeDescriptorProvider.java b/java/java-impl/src/com/intellij/ide/util/scopeChooser/HierarchyScopeDescriptorProvider.java index 36ee6dfcdb36..1eda5c607525 100644 --- a/java/java-impl/src/com/intellij/ide/util/scopeChooser/HierarchyScopeDescriptorProvider.java +++ b/java/java-impl/src/com/intellij/ide/util/scopeChooser/HierarchyScopeDescriptorProvider.java @@ -21,11 +21,17 @@ package com.intellij.ide.util.scopeChooser; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.wm.ToolWindowId; +import com.intellij.openapi.wm.ToolWindowManager; import org.jetbrains.annotations.NotNull; public class HierarchyScopeDescriptorProvider implements ScopeDescriptorProvider { @NotNull public ScopeDescriptor[] getScopeDescriptors(final Project project) { + if (Comparing.strEqual(ToolWindowManager.getInstance(project).getActiveToolWindowId(), ToolWindowId.TODO_VIEW)) { + return EMPTY; + } return new ScopeDescriptor[]{new ClassHierarchyScopeDescriptor(project)}; } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosPanel.java b/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosPanel.java index 97b3f8720f60..057082105eeb 100644 --- a/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosPanel.java +++ b/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosPanel.java @@ -22,6 +22,7 @@ package com.intellij.ide.todo; import com.intellij.ide.util.PropertiesComponent; import com.intellij.ide.util.scopeChooser.IgnoringComboBox; +import com.intellij.ide.util.scopeChooser.ScopeChooserCombo; import com.intellij.openapi.project.Project; import com.intellij.packageDependencies.DependencyValidationManager; import com.intellij.psi.search.scope.NonProjectFilesScope; @@ -44,115 +45,33 @@ import java.util.List; public class ScopeBasedTodosPanel extends TodoPanel { private static final String SELECTED_SCOPE = "TODO_SCOPE"; private final Alarm myAlarm; - private JComboBox myScopes; - private final NamedScopesHolder.ScopeListener myScopeListener; - private final NamedScopeManager myNamedScopeManager; - private final DependencyValidationManager myValidationManager; + private ScopeChooserCombo myScopes; public ScopeBasedTodosPanel(final Project project, TodoPanelSettings settings, Content content){ super(project,settings,false,content); myAlarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD, project); - final String scopeName = PropertiesComponent.getInstance(project).getValue(SELECTED_SCOPE); - rebuildModel(project, scopeName); - - myScopeListener = new NamedScopesHolder.ScopeListener() { - @Override - public void scopesChanged() { - final ScopeWrapper scope = (ScopeWrapper)myScopes.getSelectedItem(); - rebuildModel(project, scope != null ? scope.getName() : null); - } - }; - - myNamedScopeManager = NamedScopeManager.getInstance(project); - myNamedScopeManager.addScopeListener(myScopeListener); - - myValidationManager = DependencyValidationManager.getInstance(project); - myValidationManager.addScopeListener(myScopeListener); - - myScopes.setRenderer(new ListCellRendererWrapper(){ - @Override - public void customize(JList list, ScopeWrapper value, int index, boolean selected, boolean hasFocus) { - setText(value.getName()); - if (value.isSeparator()) { - setSeparator(); - } - } - }); - myScopes.addActionListener(new ActionListener() { + myScopes.getChildComponent().addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { rebuildWithAlarm(ScopeBasedTodosPanel.this.myAlarm); - final ScopeWrapper selectedItem = (ScopeWrapper)myScopes.getSelectedItem(); - if (selectedItem != null) { - PropertiesComponent.getInstance(myProject).setValue(SELECTED_SCOPE, selectedItem.getName()); + final String selectedItemName = myScopes.getSelectedScopeName(); + if (selectedItemName != null) { + PropertiesComponent.getInstance(myProject).setValue(SELECTED_SCOPE, selectedItemName); } } }); rebuildWithAlarm(myAlarm); } - @Override - public void dispose() { - myNamedScopeManager.removeScopeListener(myScopeListener); - myValidationManager.removeScopeListener(myScopeListener); - super.dispose(); - } - - private void rebuildModel(Project project, String scopeName) { - final ArrayList scopes = new ArrayList(); - final DependencyValidationManager manager = DependencyValidationManager.getInstance(project); - - scopes.add(new ScopeWrapper("Predefined Scopes")); - List predefinedScopesList = manager.getPredefinedScopes(); - NamedScope[] predefinedScopes = predefinedScopesList.toArray(new NamedScope[predefinedScopesList.size()]); - predefinedScopes = NonProjectFilesScope.removeFromList(predefinedScopes); - for (NamedScope predefinedScope : predefinedScopes) { - scopes.add(new ScopeWrapper(predefinedScope)); - } - - collectEditableScopes(scopes, manager, "Custom Project Scopes"); - collectEditableScopes(scopes, NamedScopeManager.getInstance(project), "Custom Local Scopes"); - - myScopes.setModel(new DefaultComboBoxModel(scopes.toArray(new ScopeWrapper[scopes.size()]))); - setSelection(scopeName, scopes); - } - - private void setSelection(@Nullable String scopeName, ArrayList scopes) { - boolean hasNonSeparators = false; - for (ScopeWrapper scope : scopes) { - if (!scope.isSeparator()) { - hasNonSeparators = true; - if (scopeName == null || scopeName.equals(scope.getName())) { - myScopes.setSelectedItem(scope); - return; - } - } - } - assert hasNonSeparators; - setSelection(null, scopes); - } - - private static void collectEditableScopes(ArrayList scopes, NamedScopesHolder manager, String separatorTitle) { - NamedScope[] editableScopes = manager.getEditableScopes(); - if (editableScopes.length > 0) { - scopes.add(new ScopeWrapper(separatorTitle)); - for (NamedScope scope : editableScopes) { - scopes.add(new ScopeWrapper(scope)); - } - } - } - @Override protected JComponent createCenterComponent() { JPanel panel = new JPanel(new BorderLayout()); final JComponent component = super.createCenterComponent(); panel.add(component, BorderLayout.CENTER); - myScopes = new IgnoringComboBox() { - @Override - protected boolean isIgnored(Object item) { - return item instanceof ScopeWrapper && ((ScopeWrapper)item).isSeparator(); - } - }; + String preselect = PropertiesComponent.getInstance(myProject).getValue(SELECTED_SCOPE); + myScopes = new ScopeChooserCombo(myProject, false, true, preselect); + myScopes.setCurrentSelection(false); + myScopes.setUsageView(false); JPanel chooserPanel = new JPanel(new GridBagLayout()); final JLabel scopesLabel = new JLabel("Scope:"); @@ -177,32 +96,4 @@ public class ScopeBasedTodosPanel extends TodoPanel { builder.init(); return builder; } - - public static class ScopeWrapper { - private final String myName; - private final boolean mySeparator; - private NamedScope myNamedScope; - - private ScopeWrapper(NamedScope namedScope) { - mySeparator = false; - myNamedScope = namedScope; - myName = myNamedScope.getName(); - } - private ScopeWrapper(String name) { - mySeparator = true; - myName = name; - } - - public String getName() { - return myName; - } - - public NamedScope getNamedScope() { - return myNamedScope; - } - - public boolean isSeparator() { - return mySeparator; - } - } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeBuilder.java b/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeBuilder.java index 2d7163a0d5b1..0dc79f911852 100644 --- a/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeBuilder.java +++ b/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeBuilder.java @@ -19,6 +19,7 @@ */ package com.intellij.ide.todo; +import com.intellij.ide.util.scopeChooser.ScopeChooserCombo; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; @@ -26,9 +27,9 @@ import javax.swing.*; import javax.swing.tree.DefaultTreeModel; public class ScopeBasedTodosTreeBuilder extends TodoTreeBuilder{ - private final JComboBox myScopes; + private final ScopeChooserCombo myScopes; - public ScopeBasedTodosTreeBuilder(JTree tree, DefaultTreeModel treeModel, Project project, JComboBox scopes){ + public ScopeBasedTodosTreeBuilder(JTree tree, DefaultTreeModel treeModel, Project project, ScopeChooserCombo scopes){ super(tree,treeModel,project); myScopes = scopes; } diff --git a/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeStructure.java b/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeStructure.java index 322cc44bc99c..500e17b56534 100644 --- a/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeStructure.java +++ b/platform/lang-impl/src/com/intellij/ide/todo/ScopeBasedTodosTreeStructure.java @@ -24,22 +24,14 @@ import com.intellij.ide.todo.nodes.ToDoRootNode; import com.intellij.ide.util.scopeChooser.ScopeChooserCombo; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.openapi.project.Project; -import com.intellij.openapi.vcs.changes.Change; -import com.intellij.openapi.vcs.changes.ChangeListManager; -import com.intellij.openapi.vfs.VfsUtil; -import com.intellij.packageDependencies.DependencyValidationManager; import com.intellij.psi.PsiFile; -import com.intellij.psi.search.scope.packageSet.NamedScope; -import com.intellij.psi.search.scope.packageSet.NamedScopesHolder; -import com.intellij.psi.search.scope.packageSet.PackageSet; - -import javax.swing.*; -import java.util.Collection; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.SearchScope; public class ScopeBasedTodosTreeStructure extends TodoTreeStructure { - private final JComboBox myScopes; + private final ScopeChooserCombo myScopes; - public ScopeBasedTodosTreeStructure(Project project, JComboBox scopes) { + public ScopeBasedTodosTreeStructure(Project project, ScopeChooserCombo scopes) { super(project); myScopes = scopes; } @@ -48,12 +40,9 @@ public class ScopeBasedTodosTreeStructure extends TodoTreeStructure { public boolean accept(final PsiFile psiFile) { if (!psiFile.isValid()) return false; boolean isAffected = false; - final ScopeBasedTodosPanel.ScopeWrapper scope = (ScopeBasedTodosPanel.ScopeWrapper)myScopes.getSelectedItem(); - if (scope != null) { - final PackageSet value = scope.getNamedScope().getValue(); - if (value != null) { - isAffected = value.contains(psiFile, NamedScopesHolder.getHolder(myProject, scope.getName(), DependencyValidationManager.getInstance(myProject))); - } + SearchScope scope = myScopes.getSelectedScope(); + if (scope instanceof GlobalSearchScope) { + isAffected = ((GlobalSearchScope)scope).contains(psiFile.getVirtualFile()); } return isAffected && (myTodoFilter != null && myTodoFilter.accept(mySearchHelper, psiFile) || (myTodoFilter == null && mySearchHelper.getTodoItemsCount(psiFile) > 0)); diff --git a/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java b/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java index aef7c9a17e74..8297a3db8e1f 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java +++ b/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java @@ -71,6 +71,8 @@ public class ScopeChooserCombo extends ComboboxWithBrowseButton implements Dispo private NamedScopesHolder.ScopeListener myScopeListener; private NamedScopeManager myNamedScopeManager; private DependencyValidationManager myValidationManager; + private boolean myCurrentSelection = true; + private boolean myUsageView = true; public ScopeChooserCombo() { super(new IgnoringComboBox(){ @@ -118,6 +120,14 @@ public class ScopeChooserCombo extends ComboboxWithBrowseButton implements Dispo selectScope(preselect); } + public void setCurrentSelection(boolean currentSelection) { + myCurrentSelection = currentSelection; + } + + public void setUsageView(boolean usageView) { + myUsageView = usageView; + } + @Override public void dispose() { super.dispose(); @@ -220,7 +230,7 @@ public class ScopeChooserCombo extends ComboboxWithBrowseButton implements Dispo private void createPredefinedScopeDescriptors(DefaultComboBoxModel model) { @SuppressWarnings("deprecation") final DataContext context = DataManager.getInstance().getDataContext(); - for (SearchScope scope : getPredefinedScopes(myProject, context, mySuggestSearchInLibs, myPrevSearchFiles, true, true)) { + for (SearchScope scope : getPredefinedScopes(myProject, context, mySuggestSearchInLibs, myPrevSearchFiles, myCurrentSelection, myUsageView)) { model.addElement(new ScopeDescriptor(scope)); } for (ScopeDescriptorProvider provider : Extensions.getExtensions(ScopeDescriptorProvider.EP_NAME)) { diff --git a/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeDescriptorProvider.java b/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeDescriptorProvider.java index fb879abd2595..44baafa0b86e 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeDescriptorProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeDescriptorProvider.java @@ -25,6 +25,7 @@ import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; public interface ScopeDescriptorProvider { + ScopeDescriptor[] EMPTY = new ScopeDescriptor[0]; ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.scopeDescriptorProvider"); @NotNull From adff381ade1b7451d0bf604b7db6257223ad575d Mon Sep 17 00:00:00 2001 From: Ilya Klyuchnikov Date: Tue, 19 Aug 2014 20:20:29 +0400 Subject: [PATCH 53/97] towards @Nullable inference: base NullityInterpreter --- .../bytecodeAnalysis/Parameters.java | 68 +++++++++++++++++-- 1 file changed, 64 insertions(+), 4 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java index b68b5164ba2d..aa5f70ae7a94 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java @@ -169,7 +169,7 @@ class NonNullInAnalysis extends Analysis { final private PendingAction[] pending = ourPending.get(); - private final NonNullInInterpreter interpreter = new NonNullInInterpreter(); + private final NotNullInterpreter interpreter = new NotNullInterpreter(); private PResult[] results; protected NonNullInAnalysis(RichControlFlow richControlFlow, Direction direction, boolean stable) { @@ -399,13 +399,23 @@ class NonNullInAnalysis extends Analysis { } } -class NonNullInInterpreter extends BasicInterpreter { +abstract class NullityInterpreter extends BasicInterpreter { + boolean top = false; + final boolean nullableAnalysis; private PResult subResult = Identity; + + NullityInterpreter(boolean nullableAnalysis) { + this.nullableAnalysis = nullableAnalysis; + } + + abstract PResult combine(PResult res1, PResult res2) throws AnalyzerException; + public PResult getSubResult() { return subResult; } void reset() { subResult = Identity; + top = false; } @Override @@ -445,10 +455,17 @@ class NonNullInInterpreter extends BasicInterpreter { case BALOAD: case CALOAD: case SALOAD: + if (value1 instanceof ParamValue) { + subResult = NPE; + } + break; case PUTFIELD: if (value1 instanceof ParamValue) { subResult = NPE; } + if (nullableAnalysis && value2 instanceof ParamValue) { + subResult = NPE; + } break; default: } @@ -462,13 +479,21 @@ class NonNullInInterpreter extends BasicInterpreter { case LASTORE: case FASTORE: case DASTORE: - case AASTORE: case BASTORE: case CASTORE: case SASTORE: if (value1 instanceof ParamValue) { subResult = NPE; } + break; + case AASTORE: + if (value1 instanceof ParamValue) { + subResult = NPE; + } + if (nullableAnalysis && value3 instanceof ParamValue) { + subResult = NPE; + } + break; default: } return super.ternaryOperation(insn, value1, value2, value3); @@ -483,19 +508,54 @@ class NonNullInInterpreter extends BasicInterpreter { subResult = NPE; } switch (opcode) { + case INVOKEINTERFACE: + if (nullableAnalysis) { + for (int i = shift; i < values.size(); i++) { + if (values.get(i) instanceof ParamValue) { + top = true; + return super.naryOperation(insn, values); + } + } + } + break; case INVOKESTATIC: case INVOKESPECIAL: case INVOKEVIRTUAL: boolean stable = opcode == INVOKESTATIC || opcode == INVOKESPECIAL; MethodInsnNode methodNode = (MethodInsnNode) insn; + Method method = new Method(methodNode.owner, methodNode.name, methodNode.desc); for (int i = shift; i < values.size(); i++) { if (values.get(i) instanceof ParamValue) { - Method method = new Method(methodNode.owner, methodNode.name, methodNode.desc); subResult = meet(subResult, new ConditionalNPE(new Key(method, new In(i - shift), stable))); } } + break; default: } return super.naryOperation(insn, values); } } + +class NotNullInterpreter extends NullityInterpreter { + + NotNullInterpreter() { + super(false); + } + + @Override + PResult combine(PResult res1, PResult res2) throws AnalyzerException { + return meet(res1, res2); + } +} + +class NullableInterpreter extends NullityInterpreter { + + NullableInterpreter(boolean nullableAnalysis) { + super(true); + } + + @Override + PResult combine(PResult res1, PResult res2) throws AnalyzerException { + return join(res1, res2); + } +} From 274ca5ceeff20b1a0370a778ebc9d3158c6d988b Mon Sep 17 00:00:00 2001 From: Ilya Klyuchnikov Date: Tue, 19 Aug 2014 21:24:44 +0400 Subject: [PATCH 54/97] NullableInAnalysis --- .../bytecodeAnalysis/Analysis.java | 8 + .../bytecodeAnalysis/Contracts.java | 9 +- .../bytecodeAnalysis/Parameters.java | 209 +++++++++++++++++- 3 files changed, 216 insertions(+), 10 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Analysis.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Analysis.java index 3dfc371daa64..01993d5e9dd0 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Analysis.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Analysis.java @@ -200,6 +200,14 @@ abstract class Analysis { public static final int STEPS_LIMIT = 30000; public static final int EQUATION_SIZE_LIMIT = 30; + + protected static final ThreadLocal ourPendingStates = new ThreadLocal() { + @Override + protected State[] initialValue() { + return new State[STEPS_LIMIT]; + } + }; + final RichControlFlow richControlFlow; final Direction direction; final ControlFlowGraph controlFlow; diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Contracts.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Contracts.java index 1226993383a4..c382148abb05 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Contracts.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Contracts.java @@ -37,17 +37,10 @@ import static org.jetbrains.org.objectweb.asm.Opcodes.*; class InOutAnalysis extends Analysis> { - private static final ThreadLocal ourPending = new ThreadLocal() { - @Override - protected State[] initialValue() { - return new State[Analysis.STEPS_LIMIT]; - } - }; - static final ResultUtil resultUtil = new ResultUtil(new ELattice(Value.Bot, Value.Top)); - final private State[] pending = ourPending.get(); + final private State[] pending = ourPendingStates.get(); private final InOutInterpreter interpreter; private final Value inValue; private final int generalizeShift; diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java index aa5f70ae7a94..33fc60bc6107 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java @@ -107,6 +107,18 @@ abstract class PResults { } } + static PResult combineNullable(PResult r1, PResult r2) throws AnalyzerException { + if (Identity == r1) return r2; + if (Identity == r2) return r1; + if (Return == r1) return r2; + if (Return == r2) return r1; + if (NPE == r1) return NPE; + if (NPE == r2) return NPE; + ConditionalNPE cnpe1 = (ConditionalNPE) r1; + ConditionalNPE cnpe2 = (ConditionalNPE) r2; + return new ConditionalNPE(meet(cnpe1.sop, cnpe2.sop)); + } + static PResult join(PResult r1, PResult r2) throws AnalyzerException { if (Identity == r1) return r2; if (Identity == r2) return r1; @@ -399,6 +411,199 @@ class NonNullInAnalysis extends Analysis { } } +class NullableInAnalysis extends Analysis { + final private State[] pending = ourPendingStates.get(); + + private final NullableInterpreter interpreter = new NullableInterpreter(); + + protected NullableInAnalysis(RichControlFlow richControlFlow, Direction direction, boolean stable) { + super(richControlFlow, direction, stable); + } + + @NotNull + Equation mkEquation(PResult result) { + if (NPE == result) { + return new Equation(aKey, new Final(Value.Top)); + } + if (Identity == result || Return == result) { + return new Equation(aKey, new Final(Value.Null)); + } + else { + ConditionalNPE condNpe = (ConditionalNPE) result; + Set> components = new HashSet>(); + for (Set prod : condNpe.sop) { + components.add(new Product(Value.Top, prod)); + } + return new Equation(aKey, new Pending(components)); + } + } + + private int id = 0; + private Frame nextFrame = null; + private PResult myResult = Identity; + private PResult subResult = Identity; + private boolean top = false; + + @NotNull + protected Equation analyze() throws AnalyzerException { + pendingPush(createStartState()); + int steps = 0; + while (pendingTop > 0 && earlyResult == null) { + steps ++; + if (steps >= STEPS_LIMIT) { + throw new AnalyzerException(null, "limit is reached, steps: " + steps + " in method " + method); + } + State state = pending[--pendingTop]; + int insnIndex = state.conf.insnIndex; + Conf conf = state.conf; + List history = state.history; + + boolean fold = false; + if (dfsTree.loopEnters[insnIndex]) { + for (Conf prev : history) { + if (AbstractValues.isInstance(conf, prev)) { + fold = true; + break; + } + } + } + if (fold) { + addComputed(insnIndex, state); + } + else { + State baseState = null; + List thisComputed = computed[insnIndex]; + if (thisComputed != null) { + for (State prevState : thisComputed) { + if (stateEquiv(state, prevState)) { + baseState = prevState; + break; + } + } + } + if (baseState != null) { + addComputed(insnIndex, state); + } else { + // the main call + processState(state); + } + + } + } + if (earlyResult != null) { + return mkEquation(earlyResult); + } else { + return mkEquation(myResult); + } + } + + private void processState(State state) throws AnalyzerException { + Conf conf = state.conf; + int insnIndex = conf.insnIndex; + List history = state.history; + boolean taken = state.taken; + Frame frame = conf.frame; + AbstractInsnNode insnNode = methodNode.instructions.get(insnIndex); + List nextHistory = dfsTree.loopEnters[insnIndex] ? append(history, conf) : history; + execute(frame, insnNode); + + if (subResult == NPE || top) { + earlyResult = NPE; + return; + } + + if (subResult instanceof ConditionalNPE) { + myResult = combineNullable(myResult, subResult); + } + + int opcode = insnNode.getOpcode(); + switch (opcode) { + case ARETURN: + if (popValue(frame) instanceof ParamValue) { + earlyResult = NPE; + } + return; + case IRETURN: + case LRETURN: + case FRETURN: + case DRETURN: + case RETURN: + return; + default: + } + + if (opcode == ATHROW) { + if (taken) { + earlyResult = NPE; + } + return; + } + + if (opcode == IFNONNULL && popValue(frame) instanceof ParamValue) { + int nextInsnIndex = insnIndex + 1; + pendingPush(new State(++id, new Conf(nextInsnIndex, nextFrame), nextHistory, true, false)); + return; + } + + if (opcode == IFNULL && popValue(frame) instanceof ParamValue) { + int nextInsnIndex = methodNode.instructions.indexOf(((JumpInsnNode)insnNode).label); + pendingPush(new State(++id, new Conf(nextInsnIndex, nextFrame), nextHistory, true, false)); + return; + } + + if (opcode == IFEQ && popValue(frame) == InstanceOfCheckValue) { + int nextInsnIndex = methodNode.instructions.indexOf(((JumpInsnNode)insnNode).label); + pendingPush(new State(++id, new Conf(nextInsnIndex, nextFrame), nextHistory, true, false)); + return; + } + + if (opcode == IFNE && popValue(frame) == InstanceOfCheckValue) { + int nextInsnIndex = insnIndex + 1; + pendingPush(new State(++id, new Conf(nextInsnIndex, nextFrame), nextHistory, true, false)); + return; + } + + // general case + for (int nextInsnIndex : controlFlow.transitions[insnIndex]) { + Frame nextFrame1 = nextFrame; + if (controlFlow.errors[nextInsnIndex] && controlFlow.errorTransitions.contains(new Edge(insnIndex, nextInsnIndex))) { + nextFrame1 = new Frame(frame); + nextFrame1.clearStack(); + nextFrame1.push(ASMUtils.THROWABLE_VALUE); + } + pendingPush(new State(++id, new Conf(nextInsnIndex, nextFrame1), nextHistory, taken, false)); + } + + } + + private int pendingTop = 0; + + private void pendingPush(State state) throws AnalyzerException { + if (pendingTop >= STEPS_LIMIT) { + throw new AnalyzerException(null, "limit is reached in method " + method); + } + pending[pendingTop++] = state; + } + + private void execute(Frame frame, AbstractInsnNode insnNode) throws AnalyzerException { + switch (insnNode.getType()) { + case AbstractInsnNode.LABEL: + case AbstractInsnNode.LINE: + case AbstractInsnNode.FRAME: + nextFrame = frame; + subResult = Identity; + top = false; + break; + default: + nextFrame = new Frame(frame); + interpreter.reset(); + nextFrame.execute(insnNode, interpreter); + subResult = interpreter.getSubResult(); + top = interpreter.top; + } + } +} + abstract class NullityInterpreter extends BasicInterpreter { boolean top = false; final boolean nullableAnalysis; @@ -526,7 +731,7 @@ abstract class NullityInterpreter extends BasicInterpreter { Method method = new Method(methodNode.owner, methodNode.name, methodNode.desc); for (int i = shift; i < values.size(); i++) { if (values.get(i) instanceof ParamValue) { - subResult = meet(subResult, new ConditionalNPE(new Key(method, new In(i - shift), stable))); + subResult = combine(subResult, new ConditionalNPE(new Key(method, new In(i - shift), stable))); } } break; @@ -550,7 +755,7 @@ class NotNullInterpreter extends NullityInterpreter { class NullableInterpreter extends NullityInterpreter { - NullableInterpreter(boolean nullableAnalysis) { + NullableInterpreter() { super(true); } From e88755962baee152571a8db9568af03d675ff4e3 Mon Sep 17 00:00:00 2001 From: Ilya Klyuchnikov Date: Wed, 20 Aug 2014 12:23:34 +0400 Subject: [PATCH 55/97] keys to distinguish @NotNull and @Nullable parameters analyses --- .../BytecodeAnalysisConverter.java | 11 ++-- .../bytecodeAnalysis/ClassDataIndexer.java | 6 +- .../bytecodeAnalysis/Combined.java | 4 +- .../codeInspection/bytecodeAnalysis/Data.java | 56 +++---------------- .../bytecodeAnalysis/Parameters.java | 10 ++-- .../ProjectBytecodeAnalysis.java | 2 +- 6 files changed, 27 insertions(+), 62 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java index bc041fb0dc73..c1c9a91b25d0 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java @@ -277,10 +277,11 @@ public class BytecodeAnalysisConverter { return 0; } else if (dir instanceof In) { In in = (In)dir; - return 8 * in.paramId() + 1; + // nullity mask is 0/1 + return 8 * in.paramId() + 1 + in.nullityMask; } else { InOut inOut = (InOut)dir; - return 8 * inOut.paramId() + 2 + inOut.valueId(); + return 8 * inOut.paramId() + 3 + inOut.valueId(); } } @@ -292,11 +293,11 @@ public class BytecodeAnalysisConverter { else { int paramId = directionKey / 8; int subDirection = directionKey % 8; - if (subDirection == 1) { - return new In(paramId); + if (subDirection <= 2) { + return new In(paramId, subDirection - 1); } else { - return new InOut(paramId, Value.values()[subDirection - 2]); + return new InOut(paramId, Value.values()[subDirection - 3]); } } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java index b978ec624360..9af4ec3ac534 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java @@ -232,13 +232,13 @@ public class ClassDataIndexer implements DataIndexer notNullParamEquation = new NonNullInAnalysis(richControlFlow, new In(i), stable).analyze(); + Equation notNullParamEquation = new NonNullInAnalysis(richControlFlow, new In(i, In.NOT_NULL), stable).analyze(); notNullParam = notNullParamEquation.rhs.equals(FINAL_NOT_NULL); result.add(notNullParamEquation); } else { // parameter is not leaking, so it is definitely NOT @NotNull - result.add(new Equation(new Key(method, new In(i), stable), FINAL_TOP)); + result.add(new Equation(new Key(method, new In(i, In.NOT_NULL), stable), FINAL_TOP)); } } if (isReferenceArg && isInterestingResult) { @@ -335,7 +335,7 @@ public class ClassDataIndexer implements DataIndexer(new Key(method, new In(i), stable), FINAL_TOP)); + result.add(new Equation(new Key(method, new In(i, In.NOT_NULL), stable), FINAL_TOP)); } if (isReferenceArg && isInterestingResult) { result.add(new Equation(new Key(method, new InOut(i, Value.Null), stable), FINAL_TOP)); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Combined.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Combined.java index f747c76bdb4d..d20bbcbd3cac 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Combined.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Combined.java @@ -106,7 +106,7 @@ final class CombinedSingleAnalysis { } final Equation notNullParamEquation(int i, boolean stable) { - final Key key = new Key(method, new In(i), stable); + final Key key = new Key(method, new In(i, In.NOT_NULL), stable); final Result result; if (interpreter.dereferenced[i]) { result = new Final(Value.NotNull); @@ -367,7 +367,7 @@ final class CombinedInterpreter extends BasicInterpreter { npKeys = new HashSet(); callDerefs[n] = npKeys; } - npKeys.add(new Key(method, new In(i - shift), stable)); + npKeys.add(new Key(method, new In(i - shift, In.NOT_NULL), stable)); } } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Data.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Data.java index 29050f480fbe..55a842af684c 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Data.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Data.java @@ -52,20 +52,17 @@ enum Value { Bot, NotNull, Null, True, False, Top } -interface Direction { - static final int OUT_DIRECTION = 0; - static final int IN_DIRECTION = 1; - static final int INOUT_DIRECTION = 2; - int directionId(); - int paramId(); - int valueId(); -} +interface Direction {} final class In implements Direction { + static final int NOT_NULL = 0; + static final int NULLABLE = 1; final int paramIndex; + final int nullityMask; - In(int paramIndex) { + In(int paramIndex, int nullityMask) { this.paramIndex = paramIndex; + this.nullityMask = nullityMask; } @Override @@ -79,28 +76,19 @@ final class In implements Direction { if (o == null || getClass() != o.getClass()) return false; In in = (In) o; if (paramIndex != in.paramIndex) return false; + if (nullityMask != in.nullityMask) return false; return true; } @Override public int hashCode() { - return paramIndex; + return 31*paramIndex + nullityMask; } - @Override - public int directionId() { - return IN_DIRECTION; - } - - @Override public int paramId() { return paramIndex; } - @Override - public int valueId() { - return 0; - } } final class InOut implements Direction { @@ -137,17 +125,10 @@ final class InOut implements Direction { return "InOut " + paramIndex + " " + inValue.toString(); } - @Override - public int directionId() { - return INOUT_DIRECTION; - } - - @Override public int paramId() { return paramIndex; } - @Override public int valueId() { return inValue.ordinal(); } @@ -168,21 +149,6 @@ final class Out implements Direction { public boolean equals(Object obj) { return obj instanceof Out; } - - @Override - public int directionId() { - return OUT_DIRECTION; - } - - @Override - public int paramId() { - return 0; - } - - @Override - public int valueId() { - return 0; - } } final class Key { @@ -219,10 +185,6 @@ final class Key { @Override public String toString() { - return "" + method + ' ' + direction + ' ' + stable; + return method + " " + direction + " " + stable; } } - -class LimitReachedException extends RuntimeException { - -} diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java index 33fc60bc6107..946070668753 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java @@ -607,10 +607,12 @@ class NullableInAnalysis extends Analysis { abstract class NullityInterpreter extends BasicInterpreter { boolean top = false; final boolean nullableAnalysis; + final int nullityMask; private PResult subResult = Identity; - NullityInterpreter(boolean nullableAnalysis) { + NullityInterpreter(boolean nullableAnalysis, int nullityMask) { this.nullableAnalysis = nullableAnalysis; + this.nullityMask = nullityMask; } abstract PResult combine(PResult res1, PResult res2) throws AnalyzerException; @@ -731,7 +733,7 @@ abstract class NullityInterpreter extends BasicInterpreter { Method method = new Method(methodNode.owner, methodNode.name, methodNode.desc); for (int i = shift; i < values.size(); i++) { if (values.get(i) instanceof ParamValue) { - subResult = combine(subResult, new ConditionalNPE(new Key(method, new In(i - shift), stable))); + subResult = combine(subResult, new ConditionalNPE(new Key(method, new In(i - shift, nullityMask), stable))); } } break; @@ -744,7 +746,7 @@ abstract class NullityInterpreter extends BasicInterpreter { class NotNullInterpreter extends NullityInterpreter { NotNullInterpreter() { - super(false); + super(false, In.NOT_NULL); } @Override @@ -756,7 +758,7 @@ class NotNullInterpreter extends NullityInterpreter { class NullableInterpreter extends NullityInterpreter { NullableInterpreter() { - super(true); + super(true, In.NULLABLE); } @Override diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java index ec58fb83431a..03e2d3afff91 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java @@ -162,7 +162,7 @@ public class ProjectBytecodeAnalysis { PsiElement gParent = parent.getParent(); if (gParent instanceof PsiMethod) { final int index = ((PsiParameterList)parent).getParameterIndex((PsiParameter)owner); - return BytecodeAnalysisConverter.psiKey((PsiMethod)gParent, new In(index), md); + return BytecodeAnalysisConverter.psiKey((PsiMethod)gParent, new In(index, In.NOT_NULL), md); } } } From 8eb3633fb3a8746a1a32d76c9e62275220490e4b Mon Sep 17 00:00:00 2001 From: Ilya Klyuchnikov Date: Wed, 20 Aug 2014 15:09:21 +0400 Subject: [PATCH 56/97] inference of @Nullable annotations for parameters --- .../BytecodeAnalysisConverter.java | 29 +--- .../bytecodeAnalysis/ClassDataIndexer.java | 34 ++++- .../bytecodeAnalysis/Combined.java | 101 +++++++++++-- .../bytecodeAnalysis/HData.java | 4 + .../bytecodeAnalysis/Parameters.java | 15 +- .../ProjectBytecodeAnalysis.java | 141 +++++++++++------- .../asm/LeakingParameters.java | 56 +++++-- 7 files changed, 269 insertions(+), 111 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java index c1c9a91b25d0..84a5851e847d 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisConverter.java @@ -329,14 +329,14 @@ public class BytecodeAnalysisConverter { * Given `solution` of all dependencies of a method with the `methodKey`, converts this solution into annotations. * * @param solution solution of equations - * @param annotations annotations to which corresponding solutions should be added + * @param methodAnnotations annotations to which corresponding solutions should be added * @param methodKey a primary key of a method being analyzed * @param arity arity of this method (hint for constructing @Contract annotations) */ - public static void addMethodAnnotations(@NotNull HashMap solution, @NotNull Annotations annotations, @NotNull HKey methodKey, int arity) { + public static void addMethodAnnotations(@NotNull HashMap solution, @NotNull MethodAnnotations methodAnnotations, @NotNull HKey methodKey, int arity) { List clauses = new ArrayList(); - HashSet notNulls = annotations.notNulls; - HashMap contracts = annotations.contracts; + HashSet notNulls = methodAnnotations.notNulls; + HashMap contracts = methodAnnotations.contracts; for (Map.Entry entry : solution.entrySet()) { HKey key = entry.getKey().mkStable(); Value value = entry.getValue(); @@ -364,27 +364,6 @@ public class BytecodeAnalysisConverter { } } - /** - * Converts solutions for equations over parameters into annotations. - * - * @param solution - * @param annotations - */ - public static void addParameterAnnotations(@NotNull HashMap solution, @NotNull Annotations annotations) { - HashSet notNulls = annotations.notNulls; - for (Map.Entry entry : solution.entrySet()) { - HKey key = entry.getKey().mkStable(); - Value value = entry.getValue(); - if (value == Value.Top || value == Value.Bot) { - continue; - } - Direction direction = extractDirection(key.dirKey); - if (value == Value.NotNull && (direction instanceof In || direction instanceof Out)) { - notNulls.add(key); - } - } - } - private static String contractValueString(@NotNull Value v) { switch (v) { case False: return "false"; diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java index 9af4ec3ac534..316307896467 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java @@ -42,6 +42,7 @@ public class ClassDataIndexer implements DataIndexer FINAL_TOP = new Final(Value.Top); public static final Final FINAL_BOT = new Final(Value.Bot); public static final Final FINAL_NOT_NULL = new Final(Value.NotNull); + public static final Final FINAL_NULL = new Final(Value.Null); private static final List> EMPTY_EQUATIONS = Collections.EMPTY_LIST; @NotNull @@ -129,22 +130,21 @@ public class ClassDataIndexer implements DataIndexer 0) { final DFSTree dfs = DFSTree.build(graph.transitions, graph.edgeCount); - boolean complex = !dfs.back.isEmpty(); - if (!complex) { + boolean branching = !dfs.back.isEmpty(); + if (!branching) { for (int[] transition : graph.transitions) { if (transition != null && transition.length > 1) { - complex = true; + branching = true; break; } } } - if (complex) { + if (branching) { RichControlFlow richControlFlow = new RichControlFlow(graph, dfs); if (richControlFlow.reducible()) { return Pair.create(primaryKey, @@ -180,7 +180,7 @@ public class ClassDataIndexer implements DataIndexer> result = new ArrayList>(argumentTypes.length * 3 + 1); + List> result = new ArrayList>(argumentTypes.length * 4 + 1); boolean maybeLeakingParameter = isInterestingResult; for (Type argType : argumentTypes) { if (ASMUtils.isReferenceType(argType) || (isReferenceResult && ASMUtils.isBooleanType(argType))) { @@ -193,6 +193,8 @@ public class ClassDataIndexer implements DataIndexer origins = new NullableLazyValue() { @Override @@ -231,8 +233,11 @@ public class ClassDataIndexer implements DataIndexer notNullParamEquation = new NonNullInAnalysis(richControlFlow, new In(i, In.NOT_NULL), stable).analyze(); + NonNullInAnalysis notNullInAnalysis = new NonNullInAnalysis(richControlFlow, new In(i, In.NOT_NULL), stable); + Equation notNullParamEquation = notNullInAnalysis.analyze(); + possibleNPE = notNullInAnalysis.possibleNPE; notNullParam = notNullParamEquation.rhs.equals(FINAL_NOT_NULL); result.add(notNullParamEquation); } @@ -240,6 +245,17 @@ public class ClassDataIndexer implements DataIndexer(new Key(method, new In(i, In.NOT_NULL), stable), FINAL_TOP)); } + if (leakingNullableParameters[i]) { + if (notNullParam || possibleNPE) { + result.add(new Equation(new Key(method, new In(i, In.NULLABLE), stable), FINAL_TOP)); + } + else { + result.add(new NullableInAnalysis(richControlFlow, new In(i, In.NULLABLE), stable).analyze()); + } + } + else { + result.add(new Equation(new Key(method, new In(i, In.NULLABLE), stable), FINAL_NULL)); + } } if (isReferenceArg && isInterestingResult) { if (leakingParameters[i]) { @@ -296,7 +312,7 @@ public class ClassDataIndexer implements DataIndexer> result = new ArrayList>(argumentTypes.length * 3 + 1); + List> result = new ArrayList>(argumentTypes.length * 4 + 1); CombinedSingleAnalysis analyzer = new CombinedSingleAnalysis(method, graph); analyzer.analyze(); if (isReferenceResult) { @@ -307,6 +323,7 @@ public class ClassDataIndexer implements DataIndexer(new Key(method, new In(i, In.NOT_NULL), stable), FINAL_TOP)); + result.add(new Equation(new Key(method, new In(i, In.NULLABLE), stable), FINAL_TOP)); } if (isReferenceArg && isInterestingResult) { result.add(new Equation(new Key(method, new InOut(i, Value.Null), stable), FINAL_TOP)); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Combined.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Combined.java index d20bbcbd3cac..645c00260af1 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Combined.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Combined.java @@ -28,12 +28,48 @@ import org.jetbrains.org.objectweb.asm.tree.analysis.BasicInterpreter; import org.jetbrains.org.objectweb.asm.tree.analysis.BasicValue; import org.jetbrains.org.objectweb.asm.tree.analysis.Frame; +import java.util.Collections; import java.util.List; import java.util.Set; import static com.intellij.codeInspection.bytecodeAnalysis.AbstractValues.*; import static org.jetbrains.org.objectweb.asm.Opcodes.*; +final class ParamKey { + final Method method; + final int i; + final boolean stable; + + + ParamKey(Method method, int i, boolean stable) { + this.method = method; + this.i = i; + this.stable = stable; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ParamKey paramKey = (ParamKey)o; + + if (i != paramKey.i) return false; + if (stable != paramKey.stable) return false; + if (!method.equals(paramKey.method)) return false; + + return true; + } + + @Override + public int hashCode() { + int result = method.hashCode(); + result = 31 * result + i; + result = 31 * result + (stable ? 1 : 0); + return result; + } +} + final class CombinedCall extends BasicValue { final Method method; final boolean stableCall; @@ -112,12 +148,38 @@ final class CombinedSingleAnalysis { result = new Final(Value.NotNull); } else { - Set calls = interpreter.callDerefs[i]; + Set calls = interpreter.callDerefs[i]; if (calls == null || calls.isEmpty()) { result = new Final(Value.Top); } else { - result = new Pending(new SingletonSet>(new Product(Value.Top, calls))); + Set keys = new HashSet(); + for (ParamKey pk: calls) { + keys.add(new Key(pk.method, new In(pk.i, In.NOT_NULL), pk.stable)); + } + result = new Pending(new SingletonSet>(new Product(Value.Top, keys))); + } + } + return new Equation(key, result); + } + + final Equation nullableParamEquation(int i, boolean stable) { + final Key key = new Key(method, new In(i, In.NULLABLE), stable); + final Result result; + if (interpreter.dereferenced[i] || interpreter.notNullable[i] || returnValue instanceof NParamValue && ((NParamValue)returnValue).n == i) { + result = new Final(Value.Top); + } + else { + Set calls = interpreter.callDerefs[i]; + if (calls == null || calls.isEmpty()) { + result = new Final(Value.Null); + } + else { + Set> sum = new HashSet>(); + for (ParamKey pk: calls) { + sum.add(new Product(Value.Top, Collections.singleton(new Key(pk.method, new In(pk.i, In.NULLABLE), pk.stable)))); + } + result = new Pending(sum); } } return new Equation(key, result); @@ -228,10 +290,12 @@ final class CombinedSingleAnalysis { final class CombinedInterpreter extends BasicInterpreter { final boolean[] dereferenced; - final Set[] callDerefs; + final boolean[] notNullable; + final Set[] callDerefs; CombinedInterpreter(int arity) { dereferenced = new boolean[arity]; + notNullable = new boolean[arity]; callDerefs = new Set[arity]; } @@ -303,10 +367,17 @@ final class CombinedInterpreter extends BasicInterpreter { case BALOAD: case CALOAD: case SALOAD: + if (value1 instanceof NParamValue) { + dereferenced[((NParamValue)value1).n] = true; + } + break; case PUTFIELD: if (value1 instanceof NParamValue) { dereferenced[((NParamValue)value1).n] = true; } + if (value2 instanceof NParamValue) { + notNullable[((NParamValue)value2).n] = true; + } break; default: } @@ -321,13 +392,21 @@ final class CombinedInterpreter extends BasicInterpreter { case LASTORE: case FASTORE: case DASTORE: - case AASTORE: case BASTORE: case CASTORE: case SASTORE: if (value1 instanceof NParamValue) { dereferenced[((NParamValue)value1).n] = true; } + break; + case AASTORE: + if (value1 instanceof NParamValue) { + dereferenced[((NParamValue)value1).n] = true; + } + if (value3 instanceof NParamValue) { + notNullable[((NParamValue)value3).n] = true; + } + break; default: } return super.ternaryOperation(insn, value1, value2, value3); @@ -347,7 +426,6 @@ final class CombinedInterpreter extends BasicInterpreter { } } - switch (opCode) { case INVOKESTATIC: case INVOKESPECIAL: @@ -360,14 +438,17 @@ final class CombinedInterpreter extends BasicInterpreter { for (int i = shift; i < values.size(); i++) { if (values.get(i) instanceof NParamValue) { - if (opCode != INVOKEINTERFACE) { - int n = ((NParamValue)values.get(i)).n; - Set npKeys = callDerefs[n]; + int n = ((NParamValue)values.get(i)).n; + if (opCode == INVOKEINTERFACE) { + notNullable[n] = true; + } + else { + Set npKeys = callDerefs[n]; if (npKeys == null) { - npKeys = new HashSet(); + npKeys = new HashSet(); callDerefs[n] = npKeys; } - npKeys.add(new Key(method, new In(i - shift, In.NOT_NULL), stable)); + npKeys.add(new ParamKey(method, i - shift, stable)); } } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/HData.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/HData.java index 047613847186..7c938347ccb9 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/HData.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/HData.java @@ -63,6 +63,10 @@ final class HKey { return stable ? this : new HKey(key, dirKey, true); } + HKey mkUnstable() { + return stable ? new HKey(key, dirKey, false) : this; + } + public HKey mkBase() { return dirKey == 0 ? this : new HKey(key, 0, stable); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java index 946070668753..a7c25782d48b 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Parameters.java @@ -116,7 +116,7 @@ abstract class PResults { if (NPE == r2) return NPE; ConditionalNPE cnpe1 = (ConditionalNPE) r1; ConditionalNPE cnpe2 = (ConditionalNPE) r2; - return new ConditionalNPE(meet(cnpe1.sop, cnpe2.sop)); + return new ConditionalNPE(join(cnpe1.sop, cnpe2.sop)); } static PResult join(PResult r1, PResult r2) throws AnalyzerException { @@ -184,6 +184,9 @@ class NonNullInAnalysis extends Analysis { private final NotNullInterpreter interpreter = new NotNullInterpreter(); private PResult[] results; + // Flag saying that at some branch NPE was found. Used later as an evidence that this param is *NOT* @Nullable (optimization). + boolean possibleNPE; + protected NonNullInAnalysis(RichControlFlow richControlFlow, Direction direction, boolean stable) { super(richControlFlow, direction, stable); results = ourResults.get(); @@ -301,6 +304,7 @@ class NonNullInAnalysis extends Analysis { if (subResult == NPE) { results[stateIndex] = NPE; + possibleNPE = true; addComputed(insnIndex, state); return; } @@ -326,6 +330,7 @@ class NonNullInAnalysis extends Analysis { if (opcode == ATHROW) { if (taken) { results[stateIndex] = NPE; + possibleNPE = true; } else { results[stateIndex] = Identity; } @@ -481,13 +486,9 @@ class NullableInAnalysis extends Analysis { } } } - if (baseState != null) { - addComputed(insnIndex, state); - } else { - // the main call + if (baseState == null) { processState(state); } - } } if (earlyResult != null) { @@ -505,6 +506,8 @@ class NullableInAnalysis extends Analysis { Frame frame = conf.frame; AbstractInsnNode insnNode = methodNode.instructions.get(insnIndex); List nextHistory = dfsTree.loopEnters[insnIndex] ? append(history, conf) : history; + + addComputed(insnIndex, state); execute(frame, insnNode); if (subResult == NPE || top) { diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java index 03e2d3afff91..aa44951961ad 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ProjectBytecodeAnalysis.java @@ -37,10 +37,7 @@ import org.jetbrains.annotations.Nullable; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; +import java.util.*; /** * @author lambdamix @@ -64,7 +61,7 @@ public class ProjectBytecodeAnalysis { if (!(listOwner instanceof PsiCompiledElement)) { return null; } - if (annotationFQN.equals(AnnotationUtil.NOT_NULL) || annotationFQN.equals(ControlFlowAnalyzer.ORG_JETBRAINS_ANNOTATIONS_CONTRACT)) { + if (annotationFQN.equals(AnnotationUtil.NOT_NULL) || annotationFQN.equals(AnnotationUtil.NULLABLE) || annotationFQN.equals(ControlFlowAnalyzer.ORG_JETBRAINS_ANNOTATIONS_CONTRACT)) { PsiAnnotation[] annotations = findInferredAnnotations(listOwner); for (PsiAnnotation annotation : annotations) { if (annotationFQN.equals(annotation.getQualifiedName())) { @@ -96,34 +93,45 @@ public class ProjectBytecodeAnalysis { private PsiAnnotation[] collectInferredAnnotations(PsiModifierListOwner listOwner) { try { MessageDigest md = BytecodeAnalysisConverter.getMessageDigest(); - HKey ownerKey = getKey(listOwner, md); - if (ownerKey == null) { + HKey primaryKey = getKey(listOwner, md); + if (primaryKey == null) { return PsiAnnotation.EMPTY_ARRAY; } - ArrayList allKeys = contractKeys(listOwner, ownerKey); - Annotations annotations = loadAnnotations(listOwner, ownerKey, allKeys); - boolean notNull = annotations.notNulls.contains(ownerKey); - String contractValue = annotations.contracts.get(ownerKey); - - if (notNull && contractValue != null) { - return new PsiAnnotation[]{ - getNotNullAnnotation(), - createAnnotationFromText("@" + ControlFlowAnalyzer.ORG_JETBRAINS_ANNOTATIONS_CONTRACT + "(" + contractValue + ")") - }; - } - else if (notNull) { - return new PsiAnnotation[]{ - getNotNullAnnotation() - }; - } - else if (contractValue != null) { - return new PsiAnnotation[]{ - createAnnotationFromText("@" + ControlFlowAnalyzer.ORG_JETBRAINS_ANNOTATIONS_CONTRACT + "(" + contractValue + ")") - }; - } - else { - return PsiAnnotation.EMPTY_ARRAY; + if (listOwner instanceof PsiMethod) { + ArrayList allKeys = contractKeys((PsiMethod)listOwner, primaryKey); + MethodAnnotations methodAnnotations = loadMethodAnnotations((PsiMethod)listOwner, primaryKey, allKeys); + boolean notNull = methodAnnotations.notNulls.contains(primaryKey); + String contractValue = methodAnnotations.contracts.get(primaryKey); + if (notNull && contractValue != null) { + return new PsiAnnotation[]{ + getNotNullAnnotation(), + createAnnotationFromText("@" + ControlFlowAnalyzer.ORG_JETBRAINS_ANNOTATIONS_CONTRACT + "(" + contractValue + ")") + }; + } + else if (notNull) { + return new PsiAnnotation[]{ + getNotNullAnnotation() + }; + } + else if (contractValue != null) { + return new PsiAnnotation[]{ + createAnnotationFromText("@" + ControlFlowAnalyzer.ORG_JETBRAINS_ANNOTATIONS_CONTRACT + "(" + contractValue + ")") + }; + } + } else if (listOwner instanceof PsiParameter) { + ParameterAnnotations parameterAnnotations = loadParameterAnnotations(primaryKey); + if (parameterAnnotations.notNull) { + return new PsiAnnotation[]{ + getNotNullAnnotation() + }; + } + else if (parameterAnnotations.nullable) { + return new PsiAnnotation[]{ + getNullableAnnotation() + }; + } } + return PsiAnnotation.EMPTY_ARRAY; } catch (EquationsLimitException e) { String externalName = PsiFormatUtil.getExternalName(listOwner, false, Integer.MAX_VALUE); @@ -146,6 +154,16 @@ public class ProjectBytecodeAnalysis { }); } + private PsiAnnotation getNullableAnnotation() { + return CachedValuesManager.getManager(myProject).getCachedValue(myProject, new CachedValueProvider() { + @Nullable + @Override + public Result compute() { + return Result.create(createAnnotationFromText("@" + AnnotationUtil.NULLABLE), ModificationTracker.NEVER_CHANGED); + } + }); + } + public PsiAnnotation createContractAnnotation(String contractValue) { return createAnnotationFromText("@org.jetbrains.annotations.Contract(" + contractValue + ")"); } @@ -169,36 +187,43 @@ public class ProjectBytecodeAnalysis { return null; } - public static ArrayList contractKeys(@NotNull PsiModifierListOwner owner, HKey primaryKey) { - if (owner instanceof PsiMethod) { - ArrayList result = BytecodeAnalysisConverter.mkInOutKeys((PsiMethod)owner, primaryKey); - result.add(primaryKey); - return result; - } - ArrayList result = new ArrayList(1); + public static ArrayList contractKeys(@NotNull PsiMethod owner, HKey primaryKey) { + ArrayList result = BytecodeAnalysisConverter.mkInOutKeys(owner, primaryKey); result.add(primaryKey); return result; } - private Annotations loadAnnotations(@NotNull PsiModifierListOwner owner, @NotNull HKey key, ArrayList allKeys) + private ParameterAnnotations loadParameterAnnotations(@NotNull HKey notNullKey) throws EquationsLimitException { - Annotations result = new Annotations(); - if (owner instanceof PsiParameter) { - final Solver solver = new Solver(new ELattice(Value.NotNull, Value.Top)); - collectEquations(allKeys, solver); - HashMap solutions = solver.solve(); - BytecodeAnalysisConverter.addParameterAnnotations(solutions, result); - } else if (owner instanceof PsiMethod) { - final Solver solver = new Solver(new ELattice(Value.Bot, Value.Top)); - collectEquations(allKeys, solver); - HashMap solutions = solver.solve(); - int arity = ((PsiMethod)owner).getParameterList().getParameters().length; - BytecodeAnalysisConverter.addMethodAnnotations(solutions, result, key, arity); - } + + final Solver notNullSolver = new Solver(new ELattice(Value.NotNull, Value.Top)); + collectEquations(Collections.singletonList(notNullKey), notNullSolver); + + HashMap notNullSolutions = notNullSolver.solve(); + boolean notNull = + (Value.NotNull == notNullSolutions.get(notNullKey)) || (Value.NotNull == notNullSolutions.get(notNullKey.mkUnstable())); + + final Solver nullableSolver = new Solver(new ELattice(Value.Null, Value.Top)); + final HKey nullableKey = new HKey(notNullKey.key, notNullKey.dirKey + 1, true); + collectEquations(Collections.singletonList(nullableKey), nullableSolver); + HashMap nullableSolutions = nullableSolver.solve(); + boolean nullable = + (Value.Null == nullableSolutions.get(nullableKey)) || (Value.Null == nullableSolutions.get(nullableKey.mkUnstable())); + return new ParameterAnnotations(notNull, nullable); + } + + private MethodAnnotations loadMethodAnnotations(@NotNull PsiMethod owner, @NotNull HKey key, ArrayList allKeys) + throws EquationsLimitException { + MethodAnnotations result = new MethodAnnotations(); + final Solver solver = new Solver(new ELattice(Value.Bot, Value.Top)); + collectEquations(allKeys, solver); + HashMap solutions = solver.solve(); + int arity = owner.getParameterList().getParameters().length; + BytecodeAnalysisConverter.addMethodAnnotations(solutions, result, key, arity); return result; } - private void collectEquations(ArrayList keys, Solver solver) throws EquationsLimitException { + private void collectEquations(List keys, Solver solver) throws EquationsLimitException { GlobalSearchScope librariesScope = ProjectScope.getLibrariesScope(myProject); HashSet queued = new HashSet(); Stack queue = new Stack(); @@ -258,11 +283,21 @@ public class ProjectBytecodeAnalysis { } } -class Annotations { +class MethodAnnotations { // @NotNull keys final HashSet notNulls = new HashSet(); // @Contracts final HashMap contracts = new HashMap(); } +class ParameterAnnotations { + final boolean notNull; + final boolean nullable; + + ParameterAnnotations(boolean notNull, boolean nullable) { + this.notNull = notNull; + this.nullable = nullable; + } +} + class EquationsLimitException extends Exception {} diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/asm/LeakingParameters.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/asm/LeakingParameters.java index 9fa5425e6999..1a7ab15722f9 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/asm/LeakingParameters.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/asm/LeakingParameters.java @@ -31,10 +31,12 @@ import static org.jetbrains.org.objectweb.asm.Opcodes.*; public class LeakingParameters { public final Frame[] frames; public final boolean[] parameters; + public final boolean[] nullableParameters; - public LeakingParameters(Frame[] frames, boolean[] parameters) { + public LeakingParameters(Frame[] frames, boolean[] parameters, boolean[] nullableParameters) { this.frames = frames; this.parameters = parameters; + this.nullableParameters = nullableParameters; } public static LeakingParameters build(String className, MethodNode methodNode, boolean jsr) throws AnalyzerException { @@ -57,7 +59,12 @@ public class LeakingParameters { } } } - return new LeakingParameters((Frame[])(Frame[])frames, collector.leaking); + boolean[] notNullParameters = collector.leaking; + boolean[] nullableParameters = collector.nullableLeaking; + for (int i = 0; i < nullableParameters.length; i++) { + nullableParameters[i] |= notNullParameters[i]; + } + return new LeakingParameters((Frame[])(Frame[])frames, notNullParameters, nullableParameters); } public static LeakingParameters buildFast(String className, MethodNode methodNode, boolean jsr) throws AnalyzerException { @@ -66,11 +73,14 @@ public class LeakingParameters { new Analyzer(parametersUsage).analyze(className, methodNode) : new LiteAnalyzer(parametersUsage).analyze(className, methodNode); int leakingMask = parametersUsage.leaking; - boolean[] result = new boolean[parametersUsage.arity]; - for (int i = 0; i < result.length; i++) { - result[i] = (leakingMask & (1 << i)) != 0; + int nullableLeakingMask = parametersUsage.nullableLeaking; + boolean[] notNullParameters = new boolean[parametersUsage.arity]; + boolean[] nullableParameters = new boolean[parametersUsage.arity]; + for (int i = 0; i < notNullParameters.length; i++) { + notNullParameters[i] = (leakingMask & (1 << i)) != 0; + nullableParameters[i] = ((leakingMask | nullableLeakingMask) & (1 << i)) != 0; } - return new LeakingParameters((Frame[])frames, result); + return new LeakingParameters((Frame[])frames, notNullParameters, nullableParameters); } } @@ -288,6 +298,7 @@ class IParametersUsage extends Interpreter { static final IParamsValue val1 = new IParamsValue(0, 1); static final IParamsValue val2 = new IParamsValue(0, 2); int leaking = 0; + int nullableLeaking = 0; int called = -1; final int rangeStart; final int rangeEnd; @@ -415,8 +426,12 @@ class IParametersUsage extends Interpreter { case BALOAD: case CALOAD: case SALOAD: + leaking |= value1.params; + size = 1; + break; case PUTFIELD: leaking |= value1.params; + nullableLeaking |= value2.params; size = 1; break; default: @@ -432,12 +447,15 @@ class IParametersUsage extends Interpreter { case LASTORE: case FASTORE: case DASTORE: - case AASTORE: case BASTORE: case CASTORE: case SASTORE: leaking |= value1.params; break; + case AASTORE: + leaking |= value1.params; + nullableLeaking |= value3.params; + break; default: } return val1; @@ -479,9 +497,11 @@ class IParametersUsage extends Interpreter { class LeakingParametersCollector extends ParametersUsage { final boolean[] leaking; + final boolean[] nullableLeaking; LeakingParametersCollector(MethodNode methodNode) { super(methodNode); leaking = new boolean[arity]; + nullableLeaking = new boolean[arity]; } @Override @@ -518,12 +538,21 @@ class LeakingParametersCollector extends ParametersUsage { case BALOAD: case CALOAD: case SALOAD: - case PUTFIELD: boolean[] params = value1.params; for (int i = 0; i < arity; i++) { leaking[i] |= params[i]; } break; + case PUTFIELD: + params = value1.params; + for (int i = 0; i < arity; i++) { + leaking[i] |= params[i]; + } + params = value2.params; + for (int i = 0; i < arity; i++) { + nullableLeaking[i] |= params[i]; + } + break; default: } return super.binaryOperation(insn, value1, value2); @@ -536,7 +565,6 @@ class LeakingParametersCollector extends ParametersUsage { case LASTORE: case FASTORE: case DASTORE: - case AASTORE: case BASTORE: case CASTORE: case SASTORE: @@ -545,6 +573,16 @@ class LeakingParametersCollector extends ParametersUsage { leaking[i] |= params[i]; } break; + case AASTORE: + params = value1.params; + for (int i = 0; i < arity; i++) { + leaking[i] |= params[i]; + } + params = value3.params; + for (int i = 0; i < arity; i++) { + nullableLeaking[i] |= params[i]; + } + break; default: } return super.ternaryOperation(insn, value1, value2, value3); From 44f95a9b26221b4ca9ddb58fdcbb25bcac13e71c Mon Sep 17 00:00:00 2001 From: Ilya Klyuchnikov Date: Wed, 20 Aug 2014 19:15:06 +0400 Subject: [PATCH 57/97] testing inference of @Nullable annotations for parameters --- .../annotations/java/awt/annotations.xml | 228 +++ .../java/beans/beancontext/annotations.xml | 3 + .../annotations/java/io/annotations.xml | 114 ++ .../annotations/java/lang/annotations.xml | 264 ++++ .../java/lang/invoke/annotations.xml | 177 +++ .../annotations/java/net/annotations.xml | 216 +++ .../annotations/java/security/annotations.xml | 48 + .../annotations/java/sql/annotations.xml | 54 + .../annotations/java/util/annotations.xml | 555 +++++++ .../util/concurrent/atomic/annotations.xml | 15 + .../util/concurrent/locks/annotations.xml | 12 + .../annotations/javax/swing/annotations.xml | 219 +++ .../commons/collections/annotations.xml | 15 + .../collections/iterators/annotations.xml | 11 + .../commons/collections/map/annotations.xml | 30 + .../org/apache/commons/lang/annotations.xml | 1359 +++++++++++++++++ .../commons/lang/builder/annotations.xml | 474 ++++++ .../apache/commons/lang/enum/annotations.xml | 3 + .../apache/commons/lang/enums/annotations.xml | 3 + .../commons/lang/exception/annotations.xml | 84 + .../apache/commons/lang/math/annotations.xml | 135 ++ .../commons/lang/mutable/annotations.xml | 24 + .../apache/commons/lang/text/annotations.xml | 231 +++ .../apache/commons/lang/time/annotations.xml | 87 ++ .../apache/velocity/anakia/annotations.xml | 9 + .../org/apache/velocity/annotations.xml | 8 + .../apache/velocity/app/event/annotations.xml | 21 + .../app/event/implement/annotations.xml | 39 + .../apache/velocity/app/tools/annotations.xml | 15 + .../apache/velocity/context/annotations.xml | 18 + .../apache/velocity/convert/annotations.xml | 3 + .../apache/velocity/exception/annotations.xml | 6 + .../org/apache/velocity/io/annotations.xml | 9 + .../apache/velocity/runtime/annotations.xml | 21 + .../runtime/directive/annotations.xml | 96 ++ .../velocity/runtime/log/annotations.xml | 57 + .../velocity/runtime/parser/annotations.xml | 12 + .../runtime/parser/node/annotations.xml | 129 ++ .../velocity/runtime/resource/annotations.xml | 6 + .../runtime/resource/loader/annotations.xml | 48 + .../apache/velocity/servlet/annotations.xml | 24 + .../org/apache/velocity/texen/annotations.xml | 27 + .../velocity/texen/util/annotations.xml | 3 + .../org/apache/velocity/util/annotations.xml | 9 + .../util/introspection/annotations.xml | 33 + .../BytecodeAnalysisIntegrationTest.java | 27 +- 46 files changed, 4975 insertions(+), 6 deletions(-) create mode 100644 java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/iterators/annotations.xml create mode 100644 java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/annotations.xml diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/awt/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/awt/annotations.xml index 0314b02a4d7b..2e75eb0e3c6c 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/awt/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/awt/annotations.xml @@ -1,4 +1,10 @@ + + + + + + @@ -18,6 +24,12 @@ + + + + + + @@ -26,46 +38,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -93,6 +144,9 @@ + + + @@ -107,6 +161,9 @@ + + + @@ -124,6 +181,9 @@ + + + @@ -134,6 +194,9 @@ + + + @@ -146,9 +209,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -161,9 +263,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -185,16 +332,28 @@ + + + + + + + + + + + + @@ -225,12 +384,21 @@ + + + + + + + + + @@ -252,15 +420,24 @@ + + + + + + + + + @@ -273,6 +450,9 @@ + + + @@ -290,6 +470,9 @@ + + + @@ -305,6 +488,9 @@ + + + @@ -324,21 +510,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/beans/beancontext/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/beans/beancontext/annotations.xml index 60214de88d04..ce4e092e389f 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/beans/beancontext/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/beans/beancontext/annotations.xml @@ -43,6 +43,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/io/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/io/annotations.xml index 03c11a337759..521adcf48636 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/io/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/io/annotations.xml @@ -62,6 +62,9 @@ + + + @@ -71,12 +74,21 @@ + + + + + + + + + @@ -85,15 +97,33 @@ + + + + + + + + + + + + + + + + + + @@ -103,6 +133,12 @@ + + + + + + @@ -114,6 +150,9 @@ + + + @@ -129,21 +168,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -218,6 +281,9 @@ + + + @@ -230,6 +296,9 @@ + + + @@ -244,6 +313,12 @@ + + + + + + @@ -259,6 +334,9 @@ + + + @@ -274,6 +352,9 @@ + + + @@ -283,6 +364,9 @@ + + + @@ -328,15 +412,27 @@ + + + + + + + + + + + + @@ -349,9 +445,21 @@ + + + + + + + + + + + + @@ -388,9 +496,15 @@ + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/annotations.xml index 8737a24910b2..4862b313a917 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/annotations.xml @@ -29,12 +29,24 @@ + + + + + + + + + + + + @@ -67,9 +79,18 @@ + + + + + + + + + @@ -85,16 +106,31 @@ + + + + + + + + + + + + + + + @@ -106,6 +142,9 @@ + + + @@ -115,6 +154,9 @@ + + + @@ -156,6 +198,9 @@ + + + @@ -205,6 +250,12 @@ + + + + + + @@ -215,6 +266,12 @@ + + + + + + @@ -229,6 +286,9 @@ + + + @@ -243,6 +303,15 @@ + + + + + + + + + @@ -264,9 +333,15 @@ + + + + + + @@ -279,15 +354,27 @@ + + + + + + + + + + + + @@ -296,6 +383,9 @@ + + + @@ -304,11 +394,17 @@ + + + + + + @@ -327,6 +423,9 @@ + + + @@ -347,12 +446,18 @@ + + + + + + @@ -373,6 +478,9 @@ + + + @@ -443,6 +551,9 @@ + + + @@ -507,15 +618,24 @@ + + + + + + + + + @@ -614,6 +734,12 @@ + + + + + + @@ -731,6 +857,9 @@ + + + @@ -742,6 +871,9 @@ + + + @@ -790,18 +922,30 @@ + + + + + + + + + + + + @@ -844,15 +988,24 @@ + + + + + + + + + @@ -871,6 +1024,9 @@ + + + @@ -913,18 +1069,30 @@ + + + + + + + + + + + + @@ -967,15 +1135,24 @@ + + + + + + + + + @@ -1039,18 +1216,30 @@ + + + + + + + + + + + + @@ -1093,15 +1282,24 @@ + + + + + + + + + @@ -1120,6 +1318,9 @@ + + + @@ -1153,21 +1354,36 @@ + + + + + + + + + + + + + + + @@ -1210,15 +1426,24 @@ + + + + + + + + + @@ -1255,6 +1480,12 @@ + + + + + + @@ -1273,12 +1504,24 @@ + + + + + + + + + + + + @@ -1288,12 +1531,18 @@ + + + + + + @@ -1318,6 +1567,9 @@ + + + @@ -1327,6 +1579,12 @@ + + + + + + @@ -1356,6 +1614,9 @@ + + + @@ -1371,4 +1632,7 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/invoke/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/invoke/annotations.xml index f800dab8c906..42a07af318e1 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/invoke/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/lang/invoke/annotations.xml @@ -8,6 +8,15 @@ + + + + + + + + + @@ -75,6 +84,9 @@ + + + @@ -87,9 +99,21 @@ + + + + + + + + + + + + @@ -172,12 +196,18 @@ + + + + + + @@ -187,9 +217,18 @@ + + + + + + + + + @@ -198,6 +237,9 @@ + + + @@ -229,6 +271,12 @@ + + + + + + @@ -238,12 +286,21 @@ + + + + + + + + + @@ -259,6 +316,12 @@ + + + + + + @@ -323,6 +386,9 @@ + + + @@ -578,6 +644,9 @@ + + + @@ -592,6 +661,9 @@ + + + @@ -751,6 +823,9 @@ + + + @@ -762,6 +837,12 @@ + + + + + + @@ -812,6 +893,12 @@ + + + + + + @@ -826,6 +913,9 @@ + + + @@ -840,6 +930,9 @@ + + + @@ -851,6 +944,9 @@ + + + @@ -878,6 +974,9 @@ + + + @@ -890,9 +989,18 @@ + + + + + + + + + @@ -940,6 +1048,9 @@ + + + @@ -1078,21 +1189,36 @@ + + + + + + + + + + + + + + + @@ -1101,12 +1227,21 @@ + + + + + + + + + @@ -1127,6 +1262,9 @@ + + + @@ -1136,6 +1274,15 @@ + + + + + + + + + @@ -1277,6 +1424,12 @@ + + + + + + @@ -1425,6 +1578,9 @@ + + + @@ -1512,6 +1668,9 @@ + + + @@ -1529,6 +1688,9 @@ + + + @@ -1572,6 +1734,12 @@ + + + + + + @@ -1583,6 +1751,9 @@ + + + @@ -1719,6 +1890,9 @@ + + + @@ -1863,6 +2037,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/net/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/net/annotations.xml index 6c410bc4ed65..be6006068f41 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/net/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/net/annotations.xml @@ -38,6 +38,9 @@ + + + @@ -53,6 +56,12 @@ + + + + + + @@ -90,6 +99,12 @@ + + + + + + @@ -121,24 +136,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -255,6 +384,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -303,9 +456,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -345,6 +534,9 @@ + + + @@ -368,6 +560,9 @@ + + + @@ -380,11 +575,17 @@ + + + + + + @@ -393,6 +594,9 @@ + + + @@ -416,6 +620,18 @@ + + + + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/security/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/security/annotations.xml index 756cbfcdd13e..597b80fe0d3f 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/security/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/security/annotations.xml @@ -1,4 +1,7 @@ + + + @@ -22,11 +25,17 @@ + + + + + + @@ -45,6 +54,9 @@ + + + @@ -72,6 +84,15 @@ + + + + + + + + + @@ -81,9 +102,24 @@ + + + + + + + + + + + + + + + @@ -111,9 +147,21 @@ + + + + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/sql/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/sql/annotations.xml index 2aaa71e67f39..1938616b2fff 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/sql/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/sql/annotations.xml @@ -1,10 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13,11 +40,20 @@ + + + + + + + + + @@ -29,15 +65,30 @@ + + + + + + + + + + + + + + + @@ -50,6 +101,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/annotations.xml index 363b81c827b4..5e73e2012e79 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/annotations.xml @@ -2,15 +2,27 @@ + + + + + + + + + + + + @@ -19,6 +31,15 @@ + + + + + + + + + @@ -31,6 +52,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -46,6 +94,12 @@ + + + + + + @@ -65,6 +119,9 @@ + + + @@ -85,6 +142,15 @@ + + + + + + + + + @@ -97,9 +163,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -124,6 +253,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -145,33 +304,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -181,6 +370,9 @@ + + + @@ -241,9 +433,15 @@ + + + + + + @@ -319,16 +517,28 @@ + + + + + + + + + + + + @@ -377,12 +587,18 @@ + + + + + + @@ -392,18 +608,30 @@ + + + + + + + + + + + + @@ -455,6 +683,9 @@ + + + @@ -632,6 +863,9 @@ + + + @@ -664,6 +898,9 @@ + + + @@ -700,9 +937,21 @@ + + + + + + + + + + + + @@ -711,6 +960,12 @@ + + + + + + @@ -725,6 +980,9 @@ + + + @@ -782,12 +1040,21 @@ + + + + + + + + + @@ -796,6 +1063,9 @@ + + + @@ -804,6 +1074,9 @@ + + + @@ -812,26 +1085,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -840,6 +1137,9 @@ + + + @@ -854,15 +1154,33 @@ + + + + + + + + + + + + + + + + + + @@ -926,12 +1244,33 @@ + + + + + + + + + + + + + + + + + + + + + @@ -941,15 +1280,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -958,12 +1321,21 @@ + + + + + + + + + @@ -1009,6 +1381,9 @@ + + + @@ -1026,6 +1401,9 @@ + + + @@ -1052,6 +1430,9 @@ + + + @@ -1062,6 +1443,18 @@ + + + + + + + + + + + + @@ -1070,6 +1463,15 @@ + + + + + + + + + @@ -1090,6 +1492,9 @@ + + + @@ -1120,6 +1525,9 @@ + + + @@ -1162,6 +1570,9 @@ + + + @@ -1173,25 +1584,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1209,6 +1677,9 @@ + + + @@ -1225,12 +1696,24 @@ + + + + + + + + + + + + @@ -1240,14 +1723,23 @@ + + + + + + + + + @@ -1256,9 +1748,27 @@ + + + + + + + + + + + + + + + + + + @@ -1280,12 +1790,21 @@ + + + + + + + + + @@ -1335,6 +1854,9 @@ + + + @@ -1422,11 +1944,23 @@ + + + + + + + + + + + + @@ -1475,6 +2009,9 @@ + + + @@ -1483,21 +2020,33 @@ + + + + + + + + + + + + @@ -1512,6 +2061,9 @@ + + + @@ -1527,6 +2079,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/atomic/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/atomic/annotations.xml index def395c4cf42..30e85d4f3ee8 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/atomic/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/atomic/annotations.xml @@ -59,6 +59,12 @@ + + + + + + @@ -86,9 +92,18 @@ + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/locks/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/locks/annotations.xml index a5aef3c11bb8..08c07b4d957f 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/locks/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/java/util/concurrent/locks/annotations.xml @@ -2,6 +2,9 @@ + + + @@ -35,6 +38,9 @@ + + + @@ -50,6 +56,9 @@ + + + @@ -59,6 +68,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/javax/swing/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/javax/swing/annotations.xml index c0738eb8897d..910842a47153 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/javax/swing/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/javax/swing/annotations.xml @@ -1,4 +1,10 @@ + + + + + + @@ -11,6 +17,24 @@ + + + + + + + + + + + + + + + + + + @@ -39,6 +63,9 @@ + + + @@ -49,21 +76,36 @@ + + + + + + + + + + + + + + + @@ -72,6 +114,9 @@ + + + @@ -81,6 +126,9 @@ + + + @@ -99,21 +147,33 @@ + + + + + + + + + + + + @@ -125,6 +185,21 @@ + + + + + + + + + + + + + + + @@ -161,6 +236,12 @@ + + + + + + @@ -188,6 +269,24 @@ + + + + + + + + + + + + + + + + + + @@ -199,9 +298,15 @@ + + + + + + @@ -226,6 +331,9 @@ + + + @@ -235,11 +343,17 @@ + + + + + + @@ -263,15 +377,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -293,18 +431,36 @@ + + + + + + + + + + + + + + + + + + @@ -331,11 +487,20 @@ + + + + + + + + + @@ -344,20 +509,41 @@ + + + + + + + + + + + + + + + + + + + + + @@ -379,6 +565,12 @@ + + + + + + @@ -412,6 +604,9 @@ + + + @@ -427,6 +622,9 @@ + + + @@ -441,9 +639,15 @@ + + + + + + @@ -455,9 +659,15 @@ + + + + + + @@ -469,6 +679,9 @@ + + + @@ -489,6 +702,9 @@ + + + @@ -524,4 +740,7 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/annotations.xml index dc88c6f26203..89a90c53dae2 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/annotations.xml @@ -5,6 +5,9 @@ + + + @@ -17,6 +20,9 @@ + + + @@ -37,6 +43,15 @@ + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/iterators/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/iterators/annotations.xml new file mode 100644 index 000000000000..d4cfb7e5dfde --- /dev/null +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/iterators/annotations.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/map/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/map/annotations.xml index 26b98c6bdf92..bd99ae8b862d 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/map/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/collections/map/annotations.xml @@ -2,6 +2,12 @@ + + + + + + @@ -18,6 +24,9 @@ + + + @@ -53,17 +62,26 @@ + + + + + + + + + @@ -72,6 +90,9 @@ + + + @@ -93,6 +114,9 @@ + + + @@ -108,6 +132,9 @@ + + + @@ -132,6 +159,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/annotations.xml index 18004c01e318..7115dfb72473 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/annotations.xml @@ -1,55 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58,21 +172,42 @@ + + + + + + + + + + + + + + + + + + + + + @@ -81,21 +216,42 @@ + + + + + + + + + + + + + + + + + + + + + @@ -104,21 +260,42 @@ + + + + + + + + + + + + + + + + + + + + + @@ -127,21 +304,42 @@ + + + + + + + + + + + + + + + + + + + + + @@ -150,21 +348,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -173,59 +479,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -234,21 +585,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -257,21 +638,42 @@ + + + + + + + + + + + + + + + + + + + + + @@ -280,57 +682,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -339,29 +861,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -370,6 +919,9 @@ + + + @@ -378,6 +930,9 @@ + + + @@ -388,6 +943,9 @@ + + + @@ -396,17 +954,26 @@ + + + + + + + + + @@ -415,16 +982,34 @@ + + + + + + + + + + + + + + + + + + @@ -435,24 +1020,39 @@ + + + + + + + + + + + + + + + @@ -461,20 +1061,35 @@ + + + + + + + + + + + + + + + @@ -483,14 +1098,23 @@ + + + + + + + + + @@ -505,21 +1129,33 @@ + + + + + + + + + + + + @@ -558,11 +1194,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -574,14 +1240,32 @@ + + + + + + + + + + + + + + + + + + @@ -591,16 +1275,28 @@ + + + + + + + + + + + + @@ -609,11 +1305,17 @@ + + + + + + @@ -642,6 +1344,9 @@ + + + @@ -653,21 +1358,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -685,18 +1423,30 @@ + + + + + + + + + + + + @@ -721,21 +1471,39 @@ + + + + + + + + + + + + + + + + + + @@ -744,21 +1512,36 @@ + + + + + + + + + + + + + + + @@ -767,136 +1550,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -937,6 +1942,9 @@ + + + @@ -958,6 +1966,9 @@ + + + @@ -969,24 +1980,39 @@ + + + + + + + + + + + + + + + @@ -997,11 +2023,17 @@ + + + + + + @@ -1013,16 +2045,34 @@ + + + + + + + + + + + + + + + + + + @@ -1037,81 +2087,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1170,116 +2283,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1290,6 +2487,9 @@ + + + @@ -1300,11 +2500,26 @@ + + + + + + + + + + + + + + + @@ -1315,14 +2530,23 @@ + + + + + + + + + @@ -1338,96 +2562,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1438,11 +2749,17 @@ + + + + + + @@ -1482,6 +2799,18 @@ + + + + + + + + + + + + @@ -1524,6 +2853,15 @@ + + + + + + + + + @@ -1534,6 +2872,9 @@ + + + @@ -1544,6 +2885,9 @@ + + + @@ -1554,6 +2898,9 @@ + + + @@ -1569,16 +2916,28 @@ + + + + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/builder/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/builder/annotations.xml index abd69b4689f0..4cd0e1e34b32 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/builder/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/builder/annotations.xml @@ -1,55 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -59,51 +128,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -122,9 +296,15 @@ + + + + + + @@ -137,57 +317,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -197,15 +410,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -215,6 +473,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -356,30 +668,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -389,6 +761,9 @@ + + + @@ -398,6 +773,9 @@ + + + @@ -407,6 +785,9 @@ + + + @@ -416,6 +797,9 @@ + + + @@ -425,6 +809,9 @@ + + + @@ -434,6 +821,12 @@ + + + + + + @@ -443,12 +836,27 @@ + + + + + + + + + + + + + + + @@ -458,18 +866,36 @@ + + + + + + + + + + + + + + + + + + @@ -491,6 +917,9 @@ + + + @@ -506,12 +935,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enum/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enum/annotations.xml index be5d5ca8d20e..05b15d3460ce 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enum/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enum/annotations.xml @@ -2,6 +2,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enums/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enums/annotations.xml index 0e7d219fd30a..3b827c118787 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enums/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/enums/annotations.xml @@ -2,6 +2,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/exception/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/exception/annotations.xml index 2924cb9a5731..585584b958f2 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/exception/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/exception/annotations.xml @@ -1,4 +1,10 @@ + + + + + + @@ -7,12 +13,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -22,30 +70,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -55,6 +136,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/math/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/math/annotations.xml index c799fc9bc0fd..567cb620681f 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/math/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/math/annotations.xml @@ -8,16 +8,28 @@ + + + + + + + + + + + + @@ -32,21 +44,36 @@ + + + + + + + + + + + + + + + @@ -116,21 +143,36 @@ + + + + + + + + + + + + + + + @@ -140,16 +182,28 @@ + + + + + + + + + + + + @@ -164,11 +218,20 @@ + + + + + + + + + @@ -196,48 +259,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -249,6 +357,12 @@ + + + + + + @@ -273,31 +387,52 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/mutable/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/mutable/annotations.xml index dd2d7d0d82ab..acf730ff9e41 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/mutable/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/mutable/annotations.xml @@ -2,6 +2,9 @@ + + + @@ -19,6 +22,9 @@ + + + @@ -48,6 +54,9 @@ + + + @@ -74,6 +83,9 @@ + + + @@ -100,6 +112,9 @@ + + + @@ -129,6 +144,9 @@ + + + @@ -155,6 +173,9 @@ + + + @@ -163,6 +184,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/text/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/text/annotations.xml index 05221082db79..0e46f59ecbed 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/text/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/text/annotations.xml @@ -1,4 +1,7 @@ + + + @@ -60,11 +63,32 @@ + + + + + + + + + + + + + + + + + + + + + @@ -80,16 +104,34 @@ + + + + + + + + + + + + + + + + + + @@ -120,58 +162,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -184,18 +268,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -229,16 +337,28 @@ + + + + + + + + + + + + @@ -248,6 +368,9 @@ + + + @@ -263,6 +386,9 @@ + + + @@ -290,6 +416,9 @@ + + + @@ -299,6 +428,15 @@ + + + + + + + + + @@ -308,27 +446,42 @@ + + + + + + + + + + + + + + + @@ -340,51 +493,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -406,37 +592,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/time/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/time/annotations.xml index 4a3034cf84aa..12183165228a 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/time/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/commons/lang/time/annotations.xml @@ -5,48 +5,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -320,6 +362,12 @@ + + + + + + @@ -328,11 +376,23 @@ + + + + + + + + + + + + @@ -370,6 +430,9 @@ + + + @@ -379,12 +442,24 @@ + + + + + + + + + + + + @@ -394,6 +469,9 @@ + + + @@ -403,18 +481,27 @@ + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/anakia/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/anakia/annotations.xml index a2e1c91b68a7..81935a0dc483 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/anakia/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/anakia/annotations.xml @@ -29,6 +29,9 @@ + + + @@ -70,6 +73,9 @@ + + + @@ -81,6 +87,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/annotations.xml new file mode 100644 index 000000000000..7ef87f095569 --- /dev/null +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/annotations.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/annotations.xml index ad9def7fd362..d1987cbafc38 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/annotations.xml @@ -1,14 +1,23 @@ + + + + + + + + + @@ -59,12 +68,24 @@ + + + + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/implement/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/implement/annotations.xml index 5591ed681847..643ea130fd54 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/implement/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/event/implement/annotations.xml @@ -31,12 +31,21 @@ + + + + + + + + + @@ -48,6 +57,12 @@ + + + + + + @@ -57,6 +72,12 @@ + + + + + + @@ -65,6 +86,15 @@ + + + + + + + + + @@ -73,6 +103,15 @@ + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/tools/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/tools/annotations.xml index 855a668ec63b..0117ad6dfb45 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/tools/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/app/tools/annotations.xml @@ -1,15 +1,30 @@ + + + + + + + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/context/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/context/annotations.xml index 2e739fb35c61..62279b8f44db 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/context/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/context/annotations.xml @@ -1,19 +1,31 @@ + + + + + + + + + + + + @@ -31,6 +43,12 @@ + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/convert/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/convert/annotations.xml index 8303b86a3cba..0f266c90651e 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/convert/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/convert/annotations.xml @@ -2,6 +2,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/exception/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/exception/annotations.xml index d7d2ee1dcb64..d9611079bfb5 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/exception/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/exception/annotations.xml @@ -11,7 +11,13 @@ + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/io/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/io/annotations.xml index 75ca57304d5b..f55b4257f29a 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/io/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/io/annotations.xml @@ -2,7 +2,16 @@ + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/annotations.xml index 457ea7d9dd4b..1dd01a70efdd 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/annotations.xml @@ -31,6 +31,12 @@ + + + + + + @@ -81,6 +87,9 @@ + + + @@ -89,10 +98,22 @@ + + + + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/directive/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/directive/annotations.xml index f6cd67632cb8..e9d35d5e61e8 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/directive/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/directive/annotations.xml @@ -5,6 +5,9 @@ + + + @@ -14,6 +17,9 @@ + + + @@ -25,12 +31,21 @@ + + + + + + + + + @@ -42,12 +57,24 @@ + + + + + + + + + + + + @@ -74,12 +101,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -88,6 +139,9 @@ + + + @@ -99,9 +153,15 @@ + + + + + + @@ -110,9 +170,21 @@ + + + + + + + + + + + + @@ -121,6 +193,9 @@ + + + @@ -138,9 +213,15 @@ + + + + + + @@ -171,15 +252,27 @@ + + + + + + + + + + + + @@ -194,6 +287,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/log/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/log/annotations.xml index b49c0f73e389..f3dd5bc117e1 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/log/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/log/annotations.xml @@ -8,9 +8,18 @@ + + + + + + + + + @@ -32,12 +41,30 @@ + + + + + + + + + + + + + + + + + + @@ -52,15 +79,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -73,4 +124,10 @@ + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/annotations.xml index 7d0bc8cdefa1..88ac417b986d 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/annotations.xml @@ -1,4 +1,7 @@ + + + @@ -25,9 +28,18 @@ + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/node/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/node/annotations.xml index 5f78c94ea501..b6a2face76a9 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/node/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/parser/node/annotations.xml @@ -5,6 +5,15 @@ + + + + + + + + + @@ -19,6 +28,9 @@ + + + @@ -27,6 +39,9 @@ + + + @@ -57,6 +72,9 @@ + + + @@ -65,6 +83,9 @@ + + + @@ -73,6 +94,9 @@ + + + @@ -81,6 +105,9 @@ + + + @@ -95,6 +122,9 @@ + + + @@ -103,6 +133,9 @@ + + + @@ -111,6 +144,9 @@ + + + @@ -136,6 +172,12 @@ + + + + + + @@ -160,6 +202,9 @@ + + + @@ -172,6 +217,15 @@ + + + + + + + + + @@ -205,6 +259,15 @@ + + + + + + + + + @@ -219,6 +282,9 @@ + + + @@ -239,6 +305,9 @@ + + + @@ -256,11 +325,17 @@ + + + + + + @@ -292,6 +367,12 @@ + + + + + + @@ -300,6 +381,9 @@ + + + @@ -308,6 +392,9 @@ + + + @@ -316,6 +403,9 @@ + + + @@ -324,6 +414,9 @@ + + + @@ -332,6 +425,9 @@ + + + @@ -344,9 +440,18 @@ + + + + + + + + + @@ -401,6 +506,9 @@ + + + @@ -433,6 +541,12 @@ + + + + + + @@ -448,6 +562,12 @@ + + + + + + @@ -461,14 +581,23 @@ + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/annotations.xml index c85589b43d33..6d9f27bfe3ff 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/annotations.xml @@ -1,4 +1,10 @@ + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/loader/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/loader/annotations.xml index 5fc5b3a6b8f0..ca5b1efb729c 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/loader/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/runtime/resource/loader/annotations.xml @@ -1,4 +1,7 @@ + + + @@ -7,6 +10,12 @@ + + + + + + @@ -16,41 +25,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -59,6 +98,9 @@ + + + @@ -74,6 +116,9 @@ + + + @@ -85,6 +130,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/servlet/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/servlet/annotations.xml index a1d5f80fe4ca..8c2789a533bf 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/servlet/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/servlet/annotations.xml @@ -1,13 +1,28 @@ + + + + + + + + + + + + + + + @@ -17,6 +32,15 @@ + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/annotations.xml index bea0f093ad72..8dbb538e058e 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/annotations.xml @@ -1,10 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/util/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/util/annotations.xml index 353ade77c7bc..20c60fde4b7b 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/util/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/texen/util/annotations.xml @@ -5,6 +5,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/annotations.xml index e4e4306a3a61..8b1334446ad3 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/annotations.xml @@ -27,6 +27,9 @@ + + + @@ -65,6 +68,9 @@ + + + @@ -101,6 +107,9 @@ + + + diff --git a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/introspection/annotations.xml b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/introspection/annotations.xml index 4518a467c463..4fd41ea336be 100644 --- a/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/introspection/annotations.xml +++ b/java/java-tests/testData/codeInspection/bytecodeAnalysis/annotations/org/apache/velocity/util/introspection/annotations.xml @@ -5,6 +5,9 @@ + + + @@ -90,11 +93,20 @@ + + + + + + + + + @@ -103,16 +115,37 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIntegrationTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIntegrationTest.java index 48187b9d350a..ab6d92263162 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIntegrationTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIntegrationTest.java @@ -146,12 +146,27 @@ public class BytecodeAnalysisIntegrationTest extends JavaCodeInsightFixtureTestC for (PsiParameter parameter : method.getParameterList().getParameters()) { String parameterKey = PsiFormatUtil.getExternalName(parameter, false, Integer.MAX_VALUE); - String externalParameterAnnotation = - myExternalAnnotationsManager.findExternalAnnotation(parameter, AnnotationUtil.NOT_NULL) == null ? "null" : "@NotNull"; - String inferredParameterAnnotation = - myInferredAnnotationsManager.findInferredAnnotation(parameter, AnnotationUtil.NOT_NULL) == null ? "null" : "@NotNull"; - if (!externalParameterAnnotation.equals(inferredParameterAnnotation)) { - diffs.add(parameterKey + ": " + externalParameterAnnotation + " != " + inferredParameterAnnotation); + + { + // @NotNull + String externalNotNull = + myExternalAnnotationsManager.findExternalAnnotation(parameter, AnnotationUtil.NOT_NULL) == null ? "null" : "@NotNull"; + String inferredNotNull = + myInferredAnnotationsManager.findInferredAnnotation(parameter, AnnotationUtil.NOT_NULL) == null ? "null" : "@NotNull"; + if (!externalNotNull.equals(inferredNotNull)) { + diffs.add(parameterKey + ": " + externalNotNull + " != " + inferredNotNull); + } + } + + { + // @Nullable + String externalNullable = + myExternalAnnotationsManager.findExternalAnnotation(parameter, AnnotationUtil.NULLABLE) == null ? "null" : "@Nullable"; + String inferredNullable = + myInferredAnnotationsManager.findInferredAnnotation(parameter, AnnotationUtil.NULLABLE) == null ? "null" : "@Nullable"; + if (!externalNullable.equals(inferredNullable)) { + diffs.add(parameterKey + ": " + externalNullable + " != " + inferredNullable); + } } } From 7cdcfc3c08080ba55db5c52345b5af647e0b3782 Mon Sep 17 00:00:00 2001 From: Ilya Klyuchnikov Date: Mon, 25 Aug 2014 14:08:25 +0400 Subject: [PATCH 58/97] bytecode analysis index version +1 (Inference of @Nullable parameters) --- .../codeInspection/bytecodeAnalysis/BytecodeAnalysisIndex.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIndex.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIndex.java index a477c7d59101..a7070b882431 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIndex.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisIndex.java @@ -40,7 +40,7 @@ public class BytecodeAnalysisIndex extends FileBasedIndexExtension Date: Mon, 25 Aug 2014 18:33:22 +0400 Subject: [PATCH 59/97] add gulp popup place --- .../src/com/intellij/openapi/actionSystem/ActionPlaces.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/platform-api/src/com/intellij/openapi/actionSystem/ActionPlaces.java b/platform/platform-api/src/com/intellij/openapi/actionSystem/ActionPlaces.java index e3248b863aba..16a81d2218d2 100644 --- a/platform/platform-api/src/com/intellij/openapi/actionSystem/ActionPlaces.java +++ b/platform/platform-api/src/com/intellij/openapi/actionSystem/ActionPlaces.java @@ -76,6 +76,7 @@ public abstract class ActionPlaces { public static final String ANT_MESSAGES_TOOLBAR = "AntMessagesToolbar"; public static final String ANT_EXPLORER_POPUP = "AntExplorerPopup"; public static final String ANT_EXPLORER_TOOLBAR = "AntExplorerToolbar"; + public static final String GULP_VIEW_POPUP = "JavaScriptGulpPopup"; //todo: probably these context should be splitted into several contexts public static final String CODE_INSPECTION = "CodeInspection"; @@ -133,7 +134,7 @@ public abstract class ActionPlaces { FILEVIEW_POPUP, CHECKOUT_POPUP, LVCS_DIRECTORY_HISTORY_POPUP, GUI_DESIGNER_EDITOR_POPUP, GUI_DESIGNER_COMPONENT_TREE_POPUP, GUI_DESIGNER_PROPERTY_INSPECTOR_POPUP, CREATE_EJB_POPUP, CHANGES_VIEW_POPUP, REMOTE_HOST_VIEW_POPUP, REMOTE_HOST_DIALOG_POPUP, TFS_TREE_POPUP, - ACTION_PLACE_VCS_QUICK_LIST_POPUP_ACTION, PHING_EXPLORER_POPUP, NAVIGATION_BAR_POPUP + ACTION_PLACE_VCS_QUICK_LIST_POPUP_ACTION, PHING_EXPLORER_POPUP, NAVIGATION_BAR_POPUP, GULP_VIEW_POPUP }; public static boolean isPopupPlace(@NotNull String place) { From fd2fe65bbd3d326eb21e0cf205047f4aa14c8354 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Mon, 25 Aug 2014 16:50:26 +0200 Subject: [PATCH 60/97] Don't show import pop-up by default in Edu. --- .../com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/edu/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java b/python/edu/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java index 8be56f475873..2954f7c5b706 100644 --- a/python/edu/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java +++ b/python/edu/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java @@ -116,7 +116,7 @@ public class PyCharmEduInitialConfigurator { }); } }); - PyCodeInsightSettings.getInstance().SHOW_IMPORT_POPUP = true; + PyCodeInsightSettings.getInstance().SHOW_IMPORT_POPUP = false; } if (!propertiesComponent.isValueSet(DISPLAYED_PROPERTY)) { From f405750e254a45041952bfaeac62b2e6a81a0453 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 25 Aug 2014 15:47:44 +0200 Subject: [PATCH 61/97] cleanup --- .../src/com/intellij/util/net/HttpConfigurable.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java b/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java index 599b2600bb31..a2ec8aabdccb 100644 --- a/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java +++ b/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java @@ -96,7 +96,7 @@ public class HttpConfigurable implements PersistentStateComponent Date: Mon, 25 Aug 2014 15:57:35 +0200 Subject: [PATCH 62/97] init "http configurable should not contain JComponent" --- .../src/com/intellij/util/net/HTTPProxySettingsDialog.java | 4 ++-- .../src/com/intellij/util/net/HttpConfigurable.java | 2 +- .../{HTTPProxySettingsPanel.java => HttpProxySettingsUi.java} | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename platform/platform-api/src/com/intellij/util/net/{HTTPProxySettingsPanel.java => HttpProxySettingsUi.java} (98%) diff --git a/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsDialog.java b/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsDialog.java index 86b5e441ff1e..a11867caca55 100644 --- a/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsDialog.java +++ b/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsDialog.java @@ -23,7 +23,7 @@ import javax.swing.*; import java.awt.event.ActionEvent; public class HTTPProxySettingsDialog extends DialogWrapper { - private final HTTPProxySettingsPanel panel; + private final HttpProxySettingsUi panel; private final Action okAction; private final Action cancelAction; @@ -31,7 +31,7 @@ public class HTTPProxySettingsDialog extends DialogWrapper { super(false); setTitle(CommonBundle.message("title.http.proxy.settings")); - panel = new HTTPProxySettingsPanel(HttpConfigurable.getInstance()); + panel = new HttpProxySettingsUi(HttpConfigurable.getInstance()); panel.reset(); okAction = new AbstractAction(CommonBundle.getOkButtonText()) { diff --git a/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java b/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java index a2ec8aabdccb..4bc794408f1a 100644 --- a/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java +++ b/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java @@ -97,7 +97,7 @@ public class HttpConfigurable implements PersistentStateComponent Date: Mon, 25 Aug 2014 16:55:35 +0200 Subject: [PATCH 63/97] http configurable should not contain JComponent --- .../openapi/options/ConfigurableBase.java | 0 .../openapi/options/ConfigurableUi.java | 0 .../openapi/options/SimpleConfigurable.java | 0 .../util/net/HTTPProxySettingsDialog.java | 9 +- .../util/net/HTTPProxySettingsPanel.java | 46 +++ .../intellij/util/net/HttpConfigurable.java | 2 +- ...Settings.form => HttpProxySettingsUi.form} | 2 +- .../util/net/HttpProxySettingsUi.java | 347 +++++++----------- 8 files changed, 193 insertions(+), 213 deletions(-) rename platform/{platform-impl => platform-api}/src/com/intellij/openapi/options/ConfigurableBase.java (100%) rename platform/{platform-impl => platform-api}/src/com/intellij/openapi/options/ConfigurableUi.java (100%) rename platform/{platform-impl => platform-api}/src/com/intellij/openapi/options/SimpleConfigurable.java (100%) create mode 100644 platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsPanel.java rename platform/platform-api/src/com/intellij/util/net/{HTTPProxySettings.form => HttpProxySettingsUi.form} (99%) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ConfigurableBase.java b/platform/platform-api/src/com/intellij/openapi/options/ConfigurableBase.java similarity index 100% rename from platform/platform-impl/src/com/intellij/openapi/options/ConfigurableBase.java rename to platform/platform-api/src/com/intellij/openapi/options/ConfigurableBase.java diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ConfigurableUi.java b/platform/platform-api/src/com/intellij/openapi/options/ConfigurableUi.java similarity index 100% rename from platform/platform-impl/src/com/intellij/openapi/options/ConfigurableUi.java rename to platform/platform-api/src/com/intellij/openapi/options/ConfigurableUi.java diff --git a/platform/platform-impl/src/com/intellij/openapi/options/SimpleConfigurable.java b/platform/platform-api/src/com/intellij/openapi/options/SimpleConfigurable.java similarity index 100% rename from platform/platform-impl/src/com/intellij/openapi/options/SimpleConfigurable.java rename to platform/platform-api/src/com/intellij/openapi/options/SimpleConfigurable.java diff --git a/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsDialog.java b/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsDialog.java index a11867caca55..7208cac7060d 100644 --- a/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsDialog.java +++ b/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsDialog.java @@ -31,13 +31,14 @@ public class HTTPProxySettingsDialog extends DialogWrapper { super(false); setTitle(CommonBundle.message("title.http.proxy.settings")); - panel = new HttpProxySettingsUi(HttpConfigurable.getInstance()); - panel.reset(); + final HttpConfigurable settings = HttpConfigurable.getInstance(); + panel = new HttpProxySettingsUi(settings); + panel.reset(settings); okAction = new AbstractAction(CommonBundle.getOkButtonText()) { @Override public void actionPerformed(@NotNull ActionEvent e) { - panel.apply(); + panel.apply(settings); close(OK_EXIT_CODE); } }; @@ -53,7 +54,7 @@ public class HTTPProxySettingsDialog extends DialogWrapper { @Override protected JComponent createCenterPanel() { - return panel.createComponent(); + return panel.getComponent(); } @Override diff --git a/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsPanel.java b/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsPanel.java new file mode 100644 index 000000000000..5a0f02d7823a --- /dev/null +++ b/platform/platform-api/src/com/intellij/util/net/HTTPProxySettingsPanel.java @@ -0,0 +1,46 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.util.net; + +import com.intellij.openapi.options.ConfigurableBase; +import org.jetbrains.annotations.NotNull; + +public class HTTPProxySettingsPanel extends ConfigurableBase { + public static final String NAME = "Proxy"; + + private final HttpConfigurable settings; + + public HTTPProxySettingsPanel() { + this(HttpConfigurable.getInstance()); + } + + public HTTPProxySettingsPanel(@NotNull HttpConfigurable settings) { + super("http.proxy", NAME, "http.proxy"); + + this.settings = settings; + } + + @NotNull + @Override + protected HttpConfigurable getSettings() { + return settings; + } + + @Override + protected HttpProxySettingsUi createUi() { + return new HttpProxySettingsUi(settings); + } +} \ No newline at end of file diff --git a/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java b/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java index 4bc794408f1a..cfb7afeac6a8 100644 --- a/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java +++ b/platform/platform-api/src/com/intellij/util/net/HttpConfigurable.java @@ -97,7 +97,7 @@ public class HttpConfigurable implements PersistentStateComponent -

+ diff --git a/platform/platform-api/src/com/intellij/util/net/HttpProxySettingsUi.java b/platform/platform-api/src/com/intellij/util/net/HttpProxySettingsUi.java index f5c1d0741d9e..1a7ff5d3bc65 100644 --- a/platform/platform-api/src/com/intellij/util/net/HttpProxySettingsUi.java +++ b/platform/platform-api/src/com/intellij/util/net/HttpProxySettingsUi.java @@ -15,10 +15,8 @@ */ package com.intellij.util.net; -import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.options.Configurable; -import com.intellij.openapi.options.SearchableConfigurable; +import com.intellij.openapi.options.ConfigurableUi; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.ui.MultiLineLabelUI; import com.intellij.openapi.util.Comparing; @@ -30,12 +28,9 @@ import com.intellij.ui.components.JBRadioButton; import com.intellij.util.proxy.CommonProxy; import com.intellij.util.proxy.JavaProxyProperty; import com.intellij.util.ui.UIUtil; -import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -43,8 +38,7 @@ import java.io.IOException; import java.net.HttpURLConnection; import java.util.concurrent.atomic.AtomicReference; -public class HttpProxySettingsUi implements SearchableConfigurable, Configurable.NoScroll { - public static final String NAME = "Proxy"; +class HttpProxySettingsUi implements ConfigurableUi { private JPanel myMainPanel; private JTextField myProxyLoginTextField; @@ -73,50 +67,49 @@ public class HttpProxySettingsUi implements SearchableConfigurable, Configurable private JLabel myNoProxyForLabel; private JCheckBox myPacUrlCheckBox; private JTextField myPacUrlTextField; - private final HttpConfigurable myHttpConfigurable; private volatile boolean myConnectionCheckInProgress; @Override - public boolean isModified() { - HttpConfigurable httpConfigurable = myHttpConfigurable; - if (!Comparing.equal(myProxyExceptions.getText().trim(), httpConfigurable.PROXY_EXCEPTIONS)) { + public boolean isModified(@NotNull HttpConfigurable settings) { + if (!Comparing.equal(myProxyExceptions.getText().trim(), settings.PROXY_EXCEPTIONS)) { return true; } - boolean isModified = httpConfigurable.USE_PROXY_PAC != myAutoDetectProxyRb.isSelected(); - isModified |= httpConfigurable.USE_PAC_URL != myPacUrlCheckBox.isSelected(); - isModified |= !Comparing.strEqual(httpConfigurable.PAC_URL, myPacUrlTextField.getText()); - isModified |= httpConfigurable.USE_HTTP_PROXY != myUseHTTPProxyRb.isSelected(); - isModified |= httpConfigurable.PROXY_AUTHENTICATION != myProxyAuthCheckBox.isSelected(); - isModified |= httpConfigurable.KEEP_PROXY_PASSWORD != myRememberProxyPasswordCheckBox.isSelected(); - isModified |= httpConfigurable.PROXY_TYPE_IS_SOCKS != mySocks.isSelected(); + boolean isModified = settings.USE_PROXY_PAC != myAutoDetectProxyRb.isSelected(); + isModified |= settings.USE_PAC_URL != myPacUrlCheckBox.isSelected(); + isModified |= !Comparing.strEqual(settings.PAC_URL, myPacUrlTextField.getText()); + isModified |= settings.USE_HTTP_PROXY != myUseHTTPProxyRb.isSelected(); + isModified |= settings.PROXY_AUTHENTICATION != myProxyAuthCheckBox.isSelected(); + isModified |= settings.KEEP_PROXY_PASSWORD != myRememberProxyPasswordCheckBox.isSelected(); + isModified |= settings.PROXY_TYPE_IS_SOCKS != mySocks.isSelected(); - isModified |= !Comparing.strEqual(httpConfigurable.PROXY_LOGIN, myProxyLoginTextField.getText()); - isModified |= !Comparing.strEqual(httpConfigurable.getPlainProxyPassword(),new String (myProxyPasswordTextField.getPassword())); + isModified |= !Comparing.strEqual(settings.PROXY_LOGIN, myProxyLoginTextField.getText()); + isModified |= !Comparing.strEqual(settings.getPlainProxyPassword(), new String(myProxyPasswordTextField.getPassword())); try { - isModified |= httpConfigurable.PROXY_PORT != Integer.valueOf(myProxyPortTextField.getText()).intValue(); - } catch (NumberFormatException e) { + isModified |= settings.PROXY_PORT != Integer.valueOf(myProxyPortTextField.getText()).intValue(); + } + catch (NumberFormatException e) { isModified = true; } - isModified |= !Comparing.strEqual(httpConfigurable.PROXY_HOST, myProxyHostTextField.getText()); + isModified |= !Comparing.strEqual(settings.PROXY_HOST, myProxyHostTextField.getText()); return isModified; } - public HttpProxySettingsUi(final HttpConfigurable httpConfigurable) { - final ButtonGroup group = new ButtonGroup(); + public HttpProxySettingsUi(@NotNull final HttpConfigurable settings) { + ButtonGroup group = new ButtonGroup(); group.add(myUseHTTPProxyRb); group.add(myAutoDetectProxyRb); group.add(myNoProxyRb); myNoProxyRb.setSelected(true); - final ButtonGroup proxyTypeGroup = new ButtonGroup(); + ButtonGroup proxyTypeGroup = new ButtonGroup(); proxyTypeGroup.add(myHTTP); proxyTypeGroup.add(mySocks); myHTTP.setSelected(true); myProxyExceptions.setBorder(UIUtil.getTextFieldBorder()); - final Boolean property = Boolean.getBoolean(JavaProxyProperty.USE_SYSTEM_PROXY); + Boolean property = Boolean.getBoolean(JavaProxyProperty.USE_SYSTEM_PROXY); mySystemProxyDefined.setVisible(Boolean.TRUE.equals(property)); if (Boolean.TRUE.equals(property)) { mySystemProxyDefined.setIcon(Messages.getWarningIcon()); @@ -137,7 +130,7 @@ public class HttpProxySettingsUi implements SearchableConfigurable, Configurable } }); - final ActionListener listener = new ActionListener() { + ActionListener listener = new ActionListener() { @Override public void actionPerformed(@NotNull ActionEvent e) { enableProxy(myUseHTTPProxyRb.isSelected()); @@ -146,129 +139,133 @@ public class HttpProxySettingsUi implements SearchableConfigurable, Configurable myUseHTTPProxyRb.addActionListener(listener); myAutoDetectProxyRb.addActionListener(listener); myNoProxyRb.addActionListener(listener); - myHttpConfigurable = httpConfigurable; myClearPasswordsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(@NotNull ActionEvent e) { - myHttpConfigurable.clearGenericPasswords(); + settings.clearGenericPasswords(); //noinspection DialogTitleCapitalization Messages.showMessageDialog(myMainPanel, "Proxy passwords were cleared.", "Auto-detected Proxy", Messages.getInformationIcon()); } }); - if (HttpConfigurable.getInstance() != null) { - myCheckButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(@NotNull ActionEvent e) { - final String title = "Check Proxy Settings"; - final String answer = Messages - .showInputDialog(myMainPanel, "Warning: your settings will be saved.\n\nEnter any URL to check connection to:", - title, Messages.getQuestionIcon(), "http://", null); - if (! StringUtil.isEmptyOrSpaces(answer)) { - apply(); - final HttpConfigurable instance = HttpConfigurable.getInstance(); - final AtomicReference exc = new AtomicReference(); - myCheckButton.setEnabled(false); - myCheckButton.setText("Check connection (in progress...)"); - myConnectionCheckInProgress = true; - final Application application = ApplicationManager.getApplication(); - application.executeOnPooledThread(new Runnable() { + configureCheckButton(); + } + + private void configureCheckButton() { + if (HttpConfigurable.getInstance() == null) { + myCheckButton.setVisible(false); + return; + } + + myCheckButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(@NotNull ActionEvent e) { + final String title = "Check Proxy Settings"; + final String answer = Messages.showInputDialog(myMainPanel, "Warning: your settings will be saved.\n\nEnter any URL to check connection to:", + title, Messages.getQuestionIcon(), "http://", null); + if (StringUtil.isEmptyOrSpaces(answer)) { + return; + } + + final HttpConfigurable settings = HttpConfigurable.getInstance(); + apply(settings); + final AtomicReference exceptionReference = new AtomicReference(); + myCheckButton.setEnabled(false); + myCheckButton.setText("Check connection (in progress...)"); + myConnectionCheckInProgress = true; + ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { + @Override + public void run() { + HttpURLConnection connection = null; + try { + //already checked for null above + //noinspection ConstantConditions + connection = settings.openHttpConnection(answer); + connection.setReadTimeout(3 * 1000); + connection.setConnectTimeout(3 * 1000); + connection.connect(); + final int code = connection.getResponseCode(); + if (HttpURLConnection.HTTP_OK != code) { + exceptionReference.set(new IOException("Error code: " + code)); + } + } + catch (IOException e) { + exceptionReference.set(e); + } + finally { + if (connection != null) { + connection.disconnect(); + } + } + //noinspection SSBasedInspection + SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - HttpURLConnection connection = null; - try { - //already checked for null above - //noinspection ConstantConditions - connection = instance.openHttpConnection(answer); - connection.setReadTimeout(3 * 1000); - connection.setConnectTimeout(3 * 1000); - connection.connect(); - final int code = connection.getResponseCode(); - if (HttpURLConnection.HTTP_OK != code) { - exc.set(new IOException("Error code: " + code)); - } + myConnectionCheckInProgress = false; + reset(settings); // since password might have been set + Component parent; + if (myMainPanel.isShowing()) { + parent = myMainPanel; + myCheckButton.setText("Check connection"); + myCheckButton.setEnabled(canEnableConnectionCheck()); } - catch (IOException e1) { - exc.set(e1); - } - finally { - if (connection != null) { - connection.disconnect(); + else { + IdeFrame frame = IdeFocusManager.findInstance().getLastFocusedFrame(); + if (frame == null) { + return; } + parent = frame.getComponent(); } - //noinspection SSBasedInspection - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - myConnectionCheckInProgress = false; - reset(); // since password might have been set - Component parent; - if (myMainPanel.isShowing()) { - parent = myMainPanel; - myCheckButton.setText("Check connection"); - myCheckButton.setEnabled(canEnableConnectionCheck()); - } else { - final IdeFrame frame = IdeFocusManager.findInstance().getLastFocusedFrame(); - if (frame == null) { - return; - } - parent = frame.getComponent(); - } - //noinspection ThrowableResultOfMethodCallIgnored - final IOException exception = exc.get(); - if (exception == null) { - Messages.showMessageDialog(parent, "Connection successful", title, Messages.getInformationIcon()); - } - else { - final String message = exception.getMessage(); - if (instance.USE_HTTP_PROXY) { - instance.LAST_ERROR = message; - } - Messages.showErrorDialog(parent, errorText(message)); - } + //noinspection ThrowableResultOfMethodCallIgnored + final IOException exception = exceptionReference.get(); + if (exception == null) { + Messages.showMessageDialog(parent, "Connection successful", title, Messages.getInformationIcon()); + } + else { + final String message = exception.getMessage(); + if (settings.USE_HTTP_PROXY) { + settings.LAST_ERROR = message; } - }); + Messages.showErrorDialog(parent, errorText(message)); + } } }); } - } - }); - } else { - myCheckButton.setVisible(false); - } + }); + } + }); } private boolean canEnableConnectionCheck() { - return ! myNoProxyRb.isSelected() && ! myConnectionCheckInProgress; + return !myNoProxyRb.isSelected() && !myConnectionCheckInProgress; } @Override - public void reset() { + public void reset(@NotNull HttpConfigurable settings) { myNoProxyRb.setSelected(true); // default - HttpConfigurable httpConfigurable = myHttpConfigurable; - myAutoDetectProxyRb.setSelected(httpConfigurable.USE_PROXY_PAC); - myPacUrlCheckBox.setSelected(httpConfigurable.USE_PAC_URL); - myPacUrlTextField.setText(httpConfigurable.PAC_URL); - myUseHTTPProxyRb.setSelected(httpConfigurable.USE_HTTP_PROXY); - myProxyAuthCheckBox.setSelected(httpConfigurable.PROXY_AUTHENTICATION); + myAutoDetectProxyRb.setSelected(settings.USE_PROXY_PAC); + myPacUrlCheckBox.setSelected(settings.USE_PAC_URL); + myPacUrlTextField.setText(settings.PAC_URL); + myUseHTTPProxyRb.setSelected(settings.USE_HTTP_PROXY); + myProxyAuthCheckBox.setSelected(settings.PROXY_AUTHENTICATION); - enableProxy(httpConfigurable.USE_HTTP_PROXY); + enableProxy(settings.USE_HTTP_PROXY); - myProxyLoginTextField.setText(httpConfigurable.PROXY_LOGIN); - myProxyPasswordTextField.setText(httpConfigurable.getPlainProxyPassword()); + myProxyLoginTextField.setText(settings.PROXY_LOGIN); + myProxyPasswordTextField.setText(settings.getPlainProxyPassword()); - myProxyPortTextField.setText(Integer.toString(httpConfigurable.PROXY_PORT)); - myProxyHostTextField.setText(httpConfigurable.PROXY_HOST); - myProxyExceptions.setText(httpConfigurable.PROXY_EXCEPTIONS); + myProxyPortTextField.setText(Integer.toString(settings.PROXY_PORT)); + myProxyHostTextField.setText(settings.PROXY_HOST); + myProxyExceptions.setText(settings.PROXY_EXCEPTIONS); - myRememberProxyPasswordCheckBox.setSelected(httpConfigurable.KEEP_PROXY_PASSWORD); - mySocks.setSelected(httpConfigurable.PROXY_TYPE_IS_SOCKS); - myHTTP.setSelected(!httpConfigurable.PROXY_TYPE_IS_SOCKS); + myRememberProxyPasswordCheckBox.setSelected(settings.KEEP_PROXY_PASSWORD); + mySocks.setSelected(settings.PROXY_TYPE_IS_SOCKS); + myHTTP.setSelected(!settings.PROXY_TYPE_IS_SOCKS); - final boolean showError = !StringUtil.isEmptyOrSpaces(httpConfigurable.LAST_ERROR); + final boolean showError = !StringUtil.isEmptyOrSpaces(settings.LAST_ERROR); myErrorLabel.setVisible(showError); - myErrorLabel.setText(showError ? errorText(httpConfigurable.LAST_ERROR) : ""); + myErrorLabel.setText(showError ? errorText(settings.LAST_ERROR) : ""); final String oldStyleText = CommonProxy.getMessageFromProps(CommonProxy.getOldStyleProperties()); myOtherWarning.setVisible(oldStyleText != null); @@ -284,29 +281,29 @@ public class HttpProxySettingsUi implements SearchableConfigurable, Configurable } @Override - public void apply () { - HttpConfigurable httpConfigurable = myHttpConfigurable; - if (isModified()){ - httpConfigurable.AUTHENTICATION_CANCELLED = false; + public void apply(@NotNull HttpConfigurable settings) { + if (isModified(settings)) { + settings.AUTHENTICATION_CANCELLED = false; } - httpConfigurable.USE_PROXY_PAC = myAutoDetectProxyRb.isSelected(); - httpConfigurable.USE_PAC_URL = myPacUrlCheckBox.isSelected(); - httpConfigurable.PAC_URL = trimFieldText(myPacUrlTextField); - httpConfigurable.USE_HTTP_PROXY = myUseHTTPProxyRb.isSelected(); - httpConfigurable.PROXY_TYPE_IS_SOCKS = mySocks.isSelected(); - httpConfigurable.PROXY_AUTHENTICATION = myProxyAuthCheckBox.isSelected(); - httpConfigurable.KEEP_PROXY_PASSWORD = myRememberProxyPasswordCheckBox.isSelected(); + settings.USE_PROXY_PAC = myAutoDetectProxyRb.isSelected(); + settings.USE_PAC_URL = myPacUrlCheckBox.isSelected(); + settings.PAC_URL = trimFieldText(myPacUrlTextField); + settings.USE_HTTP_PROXY = myUseHTTPProxyRb.isSelected(); + settings.PROXY_TYPE_IS_SOCKS = mySocks.isSelected(); + settings.PROXY_AUTHENTICATION = myProxyAuthCheckBox.isSelected(); + settings.KEEP_PROXY_PASSWORD = myRememberProxyPasswordCheckBox.isSelected(); - httpConfigurable.PROXY_LOGIN = trimFieldText(myProxyLoginTextField); - httpConfigurable.setPlainProxyPassword(new String(myProxyPasswordTextField.getPassword())); - httpConfigurable.PROXY_EXCEPTIONS = myProxyExceptions.getText(); + settings.PROXY_LOGIN = trimFieldText(myProxyLoginTextField); + settings.setPlainProxyPassword(new String(myProxyPasswordTextField.getPassword())); + settings.PROXY_EXCEPTIONS = myProxyExceptions.getText(); try { - httpConfigurable.PROXY_PORT = Integer.valueOf(trimFieldText(myProxyPortTextField)).intValue(); - } catch (NumberFormatException e) { - httpConfigurable.PROXY_PORT = 80; + settings.PROXY_PORT = Integer.valueOf(trimFieldText(myProxyPortTextField)).intValue(); } - httpConfigurable.PROXY_HOST = trimFieldText(myProxyHostTextField); + catch (NumberFormatException e) { + settings.PROXY_PORT = 80; + } + settings.PROXY_HOST = trimFieldText(myProxyHostTextField); } private static String trimFieldText(JTextField field) { @@ -315,7 +312,7 @@ public class HttpProxySettingsUi implements SearchableConfigurable, Configurable return trimmed; } - private void enableProxy (boolean enabled) { + private void enableProxy(boolean enabled) { myHostNameLabel.setEnabled(enabled); myPortNumberLabel.setEnabled(enabled); myProxyHostTextField.setEnabled(enabled); @@ -337,7 +334,7 @@ public class HttpProxySettingsUi implements SearchableConfigurable, Configurable myPacUrlTextField.setEnabled(autoDetectProxy && myPacUrlCheckBox.isSelected()); } - private void enableProxyAuthentication (boolean enabled) { + private void enableProxyAuthentication(boolean enabled) { myProxyPasswordLabel.setEnabled(enabled); myProxyLoginLabel.setEnabled(enabled); @@ -347,73 +344,9 @@ public class HttpProxySettingsUi implements SearchableConfigurable, Configurable myRememberProxyPasswordCheckBox.setEnabled(enabled); } + @Override + @NotNull public JComponent getComponent() { return myMainPanel; } - - @Override - public JComponent createComponent() { - return myMainPanel; - } - - @Override - @NotNull - public String getId() { - return getHelpTopic(); - } - - @Override - public Runnable enableSearch(final String option) { - return null; - } - - @Override - @Nls - public String getDisplayName() { - return NAME; - } - - @Override - @NotNull - public String getHelpTopic() { - return "http.proxy"; - } - - @Deprecated - /** - * @deprecated to remove in IDEA 15 - */ - public void addActionListener(final ActionListener actionListener) { - myProxyLoginTextField.addActionListener(actionListener); - DocumentListener docListener = new DocumentListener() { - @Override - public void insertUpdate(@NotNull DocumentEvent e) { - //noinspection ConstantConditions - actionListener.actionPerformed(null); - } - - @Override - public void removeUpdate(@NotNull DocumentEvent e) { - //noinspection ConstantConditions - actionListener.actionPerformed(null); - } - - @Override - public void changedUpdate(@NotNull DocumentEvent e) { - //noinspection ConstantConditions - actionListener.actionPerformed(null); - } - }; - myProxyPasswordTextField.getDocument().addDocumentListener(docListener); - myProxyAuthCheckBox.addActionListener(actionListener); - myProxyPortTextField.getDocument().addDocumentListener(docListener); - myProxyHostTextField.getDocument().addDocumentListener(docListener); - myUseHTTPProxyRb.addActionListener(actionListener); - myRememberProxyPasswordCheckBox.addActionListener(actionListener); - - } - - @Override - public void disposeUIResources() { - } } From b8cc0ef894c72117b82a274bec89833806b34cfe Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 25 Aug 2014 19:16:58 +0400 Subject: [PATCH 64/97] EA-59585 - IOOBE: SegmentArray.offsetOutOfRange --- .../debugger/actions/ToggleMethodBreakpointAction.java | 3 ++- platform/core-impl/src/com/intellij/util/DocumentUtil.java | 4 ++++ .../xdebugger/impl/breakpoints/XLineBreakpointImpl.java | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/ToggleMethodBreakpointAction.java b/java/debugger/impl/src/com/intellij/debugger/actions/ToggleMethodBreakpointAction.java index 097039b0f9f4..b239fee363fc 100644 --- a/java/debugger/impl/src/com/intellij/debugger/actions/ToggleMethodBreakpointAction.java +++ b/java/debugger/impl/src/com/intellij/debugger/actions/ToggleMethodBreakpointAction.java @@ -38,6 +38,7 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiMethod; +import com.intellij.util.DocumentUtil; import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.Nullable; @@ -66,7 +67,7 @@ public class ToggleMethodBreakpointAction extends AnAction { } final BreakpointManager manager = debugManager.getBreakpointManager(); final PlaceInDocument place = getPlace(e); - if(place != null) { + if(place != null && DocumentUtil.isValidOffset(place.getOffset(), place.getDocument())) { Breakpoint breakpoint = manager.findBreakpoint(place.getDocument(), place.getOffset(), MethodBreakpoint.CATEGORY); if(breakpoint == null) { final int methodLine = place.getDocument().getLineNumber(place.getOffset()); diff --git a/platform/core-impl/src/com/intellij/util/DocumentUtil.java b/platform/core-impl/src/com/intellij/util/DocumentUtil.java index e2c78be69a3e..df9d26c6e690 100644 --- a/platform/core-impl/src/com/intellij/util/DocumentUtil.java +++ b/platform/core-impl/src/com/intellij/util/DocumentUtil.java @@ -82,4 +82,8 @@ public final class DocumentUtil { } return startOffset; } + + public static boolean isValidOffset(int offset, @NotNull Document document) { + return offset >= 0 && offset <= document.getTextLength(); + } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XLineBreakpointImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XLineBreakpointImpl.java index e2ce9ca7c63d..855abaaad74e 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XLineBreakpointImpl.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XLineBreakpointImpl.java @@ -36,6 +36,7 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.util.DocumentUtil; import com.intellij.xdebugger.XDebugSession; import com.intellij.xdebugger.XDebuggerUtil; import com.intellij.xdebugger.XSourcePosition; @@ -91,7 +92,7 @@ public class XLineBreakpointImpl

extends XBreak RangeHighlighterEx highlighter = myHighlighter; if (highlighter != null && (!highlighter.isValid() - || highlighter.getStartOffset() >= document.getTextLength() + || !DocumentUtil.isValidOffset(highlighter.getStartOffset(), document) || !Comparing.equal(highlighter.getTextAttributes(), attributes) // it seems that this check is not needed - we always update line number from the highlighter // and highlighter is removed on line and file change anyway From 62811369bca45f9a067efef1d3bfeb8c754d1a12 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 25 Aug 2014 19:24:19 +0400 Subject: [PATCH 65/97] EA-59022 - NPE: XAddToWatchesAction.getWatchesView --- .../impl/ui/tree/actions/XAddToWatchesAction.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/actions/XAddToWatchesAction.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/actions/XAddToWatchesAction.java index 7c77bafc6553..211fddae40ea 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/actions/XAddToWatchesAction.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/actions/XAddToWatchesAction.java @@ -23,6 +23,7 @@ import com.intellij.xdebugger.XDebuggerManager; import com.intellij.xdebugger.impl.XDebugSessionImpl; import com.intellij.xdebugger.impl.breakpoints.XExpressionImpl; import com.intellij.xdebugger.impl.frame.XWatchesView; +import com.intellij.xdebugger.impl.ui.XDebugSessionTab; import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl; import org.jetbrains.annotations.NotNull; @@ -41,10 +42,7 @@ class XAddToWatchesAction extends XDebuggerTreeActionBase { if (watchesView != null) { String expression = node.getValueContainer().getEvaluationExpression(); if (!StringUtil.isEmpty(expression)) { - XExpressionImpl watchExpression = XExpressionImpl.fromText(expression); - if (watchExpression != null) { - watchesView.addWatchExpression(watchExpression, -1, true); - } + watchesView.addWatchExpression(XExpressionImpl.fromText(expression), -1, true); } } } @@ -55,7 +53,10 @@ class XAddToWatchesAction extends XDebuggerTreeActionBase { if (view == null && project != null) { XDebugSession session = XDebuggerManager.getInstance(project).getCurrentSession(); if (session != null) { - return ((XDebugSessionImpl)session).getSessionTab().getWatchesView(); + XDebugSessionTab tab = ((XDebugSessionImpl)session).getSessionTab(); + if (tab != null) { + return tab.getWatchesView(); + } } } return view; From 96e2ed16c08e2405457319ee7f88fae7f148195d Mon Sep 17 00:00:00 2001 From: Sergey Savenko Date: Mon, 25 Aug 2014 19:37:02 +0400 Subject: [PATCH 66/97] DocumentationManager: fix triple QuickDoc action invocation --- .../documentation/DockablePopupManager.java | 61 ++++++++++--------- .../documentation/DocumentationComponent.java | 4 ++ .../documentation/DocumentationManager.java | 41 ++++++------- 3 files changed, 57 insertions(+), 49 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DockablePopupManager.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DockablePopupManager.java index 83f17299987b..64bd08ee1da1 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DockablePopupManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DockablePopupManager.java @@ -24,6 +24,7 @@ import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.AsyncResult; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowAnchor; import com.intellij.openapi.wm.ToolWindowType; @@ -136,30 +137,37 @@ public abstract class DockablePopupManager { protected AnAction[] createActions() { - return new AnAction[]{ - new ToggleAction(getAutoUpdateTitle(), getAutoUpdateDescription(), - AllIcons.General.AutoscrollFromSource) { - @Override - public boolean isSelected(AnActionEvent e) { - return myAutoUpdateDocumentation; - } + ToggleAction toggleAutoUpdateAction = new ToggleAction(getAutoUpdateTitle(), getAutoUpdateDescription(), + AllIcons.General.AutoscrollFromSource) { + @Override + public boolean isSelected(AnActionEvent e) { + return myAutoUpdateDocumentation; + } - @Override - public void setSelected(AnActionEvent e, boolean state) { - PropertiesComponent.getInstance().setValue(getAutoUpdateEnabledProperty(), String.valueOf(state)); - myAutoUpdateDocumentation = state; - restartAutoUpdate(state); - } - }, - new AnAction("Restore Popup", getRestorePopupDescription(), AllIcons.Actions.Cancel) { - @Override - public void actionPerformed(AnActionEvent e) { - restorePopupBehavior(); - } - }}; + @Override + public void setSelected(AnActionEvent e, boolean state) { + PropertiesComponent.getInstance().setValue(getAutoUpdateEnabledProperty(), String.valueOf(state)); + myAutoUpdateDocumentation = state; + restartAutoUpdate(state); + } + }; + AnAction restorePopupAction = new AnAction("Restore Popup", getRestorePopupDescription(), AllIcons.Actions.Cancel) { + @Override + public void actionPerformed(AnActionEvent e) { + restorePopupBehavior(); + } + }; + ShortcutSet restorePopupShortcutSet = getRestorePopupShortcutSet(); + if (restorePopupShortcutSet != null) { + restorePopupAction.registerCustomShortcutSet(restorePopupShortcutSet, null); + } + return new AnAction[]{toggleAutoUpdateAction, restorePopupAction}; + } + + protected ShortcutSet getRestorePopupShortcutSet() { + return null; } - protected void restartAutoUpdate(final boolean state) { if (state && myToolWindow != null) { if (myAutoUpdateRequest == null) { @@ -228,13 +236,10 @@ public abstract class DockablePopupManager { protected void restorePopupBehavior() { if (myToolWindow != null) { PropertiesComponent.getInstance().setValue(getShowInToolWindowProperty(), Boolean.FALSE.toString()); - - final Content[] contents = myToolWindow.getContentManager().getContents(); - for (final Content content : contents) { - myToolWindow.getContentManager().removeContent(content, true); - } - - ToolWindowManagerEx.getInstanceEx(myProject).unregisterToolWindow(getToolwindowId()); + ToolWindowManagerEx toolWindowManagerEx = ToolWindowManagerEx.getInstanceEx(myProject); + toolWindowManagerEx.hideToolWindow(getToolwindowId(), false); + toolWindowManagerEx.unregisterToolWindow(getToolwindowId()); + Disposer.dispose(myToolWindow.getContentManager()); myToolWindow = null; restartAutoUpdate(false); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java index 0ebff2eaf9d5..50f69088033b 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java @@ -324,6 +324,10 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr if (additionalActions != null) { for (final AnAction action : additionalActions) { actions.add(action); + ShortcutSet shortcutSet = action.getShortcutSet(); + if (shortcutSet != null) { + action.registerCustomShortcutSet(shortcutSet, this); + } } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java index d4a64ab794c4..2b42e70ac250 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java @@ -126,6 +126,11 @@ public class DocumentationManager extends DockablePopupManagertrue if quick doc control is configured to not prevent user-IDE interaction (e.g. should be closed if * the user presses a key); @@ -258,7 +263,7 @@ public class DocumentationManager extends DockablePopupManager Date: Mon, 25 Aug 2014 17:08:39 +0200 Subject: [PATCH 67/97] allow to override get/Selection/Background/Foreground --- .../src/com/intellij/ui/GroupedElementsRenderer.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/GroupedElementsRenderer.java b/platform/platform-api/src/com/intellij/ui/GroupedElementsRenderer.java index 76bacb9cb452..a2e8aacc046f 100644 --- a/platform/platform-api/src/com/intellij/ui/GroupedElementsRenderer.java +++ b/platform/platform-api/src/com/intellij/ui/GroupedElementsRenderer.java @@ -165,22 +165,22 @@ public abstract class GroupedElementsRenderer { } @Override - protected final Color getSelectionBackground() { + protected Color getSelectionBackground() { return UIUtil.getTreeSelectionBackground(); } @Override - protected final Color getSelectionForeground() { + protected Color getSelectionForeground() { return UIUtil.getTreeSelectionForeground(); } @Override - protected final Color getBackground() { + protected Color getBackground() { return UIUtil.getTreeTextBackground(); } @Override - protected final Color getForeground() { + protected Color getForeground() { return UIUtil.getTreeTextForeground(); } } From 2c82934ec6f1bda6f542f50d4af13f6b73473658 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 17:59:03 +0200 Subject: [PATCH 68/97] change renderer and tree bg to side panel color --- .../options/newEditor/SettingsTreeView.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java index 16758fc11df4..e4777939ab60 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java @@ -26,7 +26,10 @@ import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.*; -import com.intellij.ui.treeStructure.*; +import com.intellij.ui.treeStructure.CachingSimpleNode; +import com.intellij.ui.treeStructure.SimpleNode; +import com.intellij.ui.treeStructure.SimpleTree; +import com.intellij.ui.treeStructure.SimpleTreeStructure; import com.intellij.ui.treeStructure.filtered.FilteringTreeBuilder; import com.intellij.ui.treeStructure.filtered.FilteringTreeStructure; import com.intellij.util.ArrayUtil; @@ -49,7 +52,10 @@ import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import java.awt.*; -import java.awt.event.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; import java.util.*; import java.util.List; @@ -74,8 +80,8 @@ final class SettingsTreeView extends JComponent implements Disposable, OptionsEd SettingsTreeView(SettingsFilter filter, ConfigurableGroup... groups) { myFilter = filter; myRoot = new MyRoot(groups); - myTree = new MyTree(); + myTree.setBackground(UIUtil.getSidePanelColor()); myTree.getInputMap().clear(); TreeUtil.installActions(myTree); @@ -89,8 +95,7 @@ final class SettingsTreeView extends JComponent implements Disposable, OptionsEd myTree.setRootVisible(false); myTree.setShowsRootHandles(false); - myScroller = ScrollPaneFactory.createScrollPane(myTree); - myScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); + myScroller = ScrollPaneFactory.createScrollPane(myTree, true); add(myScroller); myTree.addComponentListener(new ComponentAdapter() { @@ -465,6 +470,11 @@ final class SettingsTreeView extends JComponent implements Disposable, OptionsEd return myTextLabel; } + @Override + protected Color getBackground() { + return UIUtil.getSidePanelColor(); + } + @Override protected void layout() { myNodeIcon = new JLabel(" ", SwingConstants.RIGHT); From 21cb2185cc020ebd1dac5f7ee5530b392a88b7e3 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 18:00:45 +0200 Subject: [PATCH 69/97] reformat. Remove content pane insets --- .../options/newEditor/IdeSettingsDialog.java | 490 +++++++++--------- 1 file changed, 257 insertions(+), 233 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java index 26ce696530c8..aa3507b03532 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java @@ -29,11 +29,14 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.Disposer; +import com.intellij.ui.IdeBorderFactory; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; @@ -45,257 +48,278 @@ import java.util.Map; * @author Konstantin Bulenkov */ public class IdeSettingsDialog extends DialogWrapper implements DataProvider { - private Project myProject; - private ConfigurableGroup[] myGroups; - private Configurable myPreselected; - private OptionsEditor myEditor; + private Project myProject; + private ConfigurableGroup[] myGroups; + private Configurable myPreselected; + private OptionsEditor myEditor; - private ApplyAction myApplyAction; - public static final String DIMENSION_KEY = "OptionsEditor"; - @NonNls static final String LAST_SELECTED_CONFIGURABLE = "options.lastSelected"; + private ApplyAction myApplyAction; + public static final String DIMENSION_KEY = "OptionsEditor"; + @NonNls static final String LAST_SELECTED_CONFIGURABLE = "options.lastSelected"; - /** This constructor should be eliminated after the new modality approach - * will have been checked. See a {@code Registry} key ide.perProjectModality - * @deprecated - */ - public IdeSettingsDialog(Project project, ConfigurableGroup[] groups, - @Nullable Configurable preselectedConfigurable, boolean applicationModalIfPossible) { - super(project, true, applicationModalIfPossible); - init(project, groups, preselectedConfigurable != null ? preselectedConfigurable : findLastSavedConfigurable(groups, project)); + /** + * This constructor should be eliminated after the new modality approach + * will have been checked. See a {@code Registry} key ide.perProjectModality + * + * @deprecated + */ + public IdeSettingsDialog(Project project, ConfigurableGroup[] groups, + @Nullable Configurable preselectedConfigurable, boolean applicationModalIfPossible) { + super(project, true, applicationModalIfPossible); + init(project, groups, preselectedConfigurable != null ? preselectedConfigurable : findLastSavedConfigurable(groups, project)); + } + + /** + * This constructor should be eliminated after the new modality approach + * will have been checked. See a {@code Registry} key ide.perProjectModality + * + * @deprecated + */ + public IdeSettingsDialog(Project project, ConfigurableGroup[] groups, + @NotNull String preselectedConfigurableDisplayName, boolean applicationModalIfPossible) { + super(project, true, applicationModalIfPossible); + init(project, groups, getPreselectedByDisplayName(groups, preselectedConfigurableDisplayName, project)); + } + + public IdeSettingsDialog(Project project, ConfigurableGroup[] groups, @Nullable Configurable preselectedConfigurable) { + super(project, true); + init(project, groups, preselectedConfigurable != null ? preselectedConfigurable : findLastSavedConfigurable(groups, project)); + } + + public IdeSettingsDialog(Project project, ConfigurableGroup[] groups, @NotNull String preselectedConfigurableDisplayName) { + super(project, true); + init(project, groups, getPreselectedByDisplayName(groups, preselectedConfigurableDisplayName, project)); + } + + @Nullable + @Override + protected Border createContentPaneBorder() { + return IdeBorderFactory.createEmptyBorder(0); + } + + private void init(final Project project, final ConfigurableGroup[] groups, @Nullable final Configurable preselected) { + myProject = project; + myGroups = groups; + myPreselected = preselected; + + setTitle(CommonBundle.settingsTitle()); + + init(); + } + + @Nullable + private static Configurable getPreselectedByDisplayName(final ConfigurableGroup[] groups, final String preselectedConfigurableDisplayName, + final Project project) { + Configurable result = findPreselectedByDisplayName(preselectedConfigurableDisplayName, groups); + + return result == null ? findLastSavedConfigurable(groups, project) : result; + } + + @Override + public boolean isTypeAheadEnabled() { + return true; + } + + @Nullable + @Override + protected JComponent createSouthPanel() { + final JComponent panel = super.createSouthPanel(); + panel.setBorder(new EmptyBorder(0, 12, 8, 12)); + return panel; + } + + protected JComponent createCenterPanel() { + myEditor = new OptionsEditor(myProject, myGroups, myPreselected); + myEditor.getContext().addColleague(new OptionsEditorColleague.Adapter() { + @Override + public ActionCallback onModifiedAdded(final Configurable configurable) { + updateStatus(); + return new ActionCallback.Done(); + } + + @Override + public ActionCallback onModifiedRemoved(final Configurable configurable) { + updateStatus(); + return new ActionCallback.Done(); + } + + @Override + public ActionCallback onErrorsChanged() { + updateStatus(); + return new ActionCallback.Done(); + } + }); + Disposer.register(myDisposable, myEditor); + return myEditor; + } + + public boolean updateStatus() { + myApplyAction.setEnabled(myEditor.canApply()); + + final Map errors = myEditor.getContext().getErrors(); + if (errors.size() == 0) { + setErrorText(null); + } + else { + String text = "Changes were not applied because of an error"; + + final String errorMessage = getErrorMessage(errors); + if (errorMessage != null) { + text += "
" + errorMessage; + } + + setErrorText(text); } - /** This constructor should be eliminated after the new modality approach - * will have been checked. See a {@code Registry} key ide.perProjectModality - * @deprecated - */ - public IdeSettingsDialog(Project project, ConfigurableGroup[] groups, - @NotNull String preselectedConfigurableDisplayName, boolean applicationModalIfPossible) { - super(project, true, applicationModalIfPossible); - init(project, groups, getPreselectedByDisplayName(groups, preselectedConfigurableDisplayName, project)); + return errors.size() == 0; + } + + @Nullable + private static String getErrorMessage(final Map errors) { + final Collection values = errors.values(); + final ConfigurationException[] exceptions = values.toArray(new ConfigurationException[values.size()]); + if (exceptions.length > 0) { + return exceptions[0].getMessage(); + } + return null; + } + + @Override + protected String getDimensionServiceKey() { + return DIMENSION_KEY; + } + + @Override + protected void doOKAction() { + myEditor.flushModifications(); + + if (myEditor.canApply()) { + myEditor.apply(); + if (!updateStatus()) return; } - public IdeSettingsDialog(Project project, ConfigurableGroup[] groups, @Nullable Configurable preselectedConfigurable) { - super(project, true); - init(project, groups, preselectedConfigurable != null ? preselectedConfigurable : findLastSavedConfigurable(groups, project)); + saveCurrentConfigurable(); + + ApplicationManager.getApplication().saveAll(); + + super.doOKAction(); + } + + + private void saveCurrentConfigurable() { + final Configurable current = myEditor.getContext().getCurrentConfigurable(); + if (current == null) return; + + final PropertiesComponent props = PropertiesComponent.getInstance(myProject); + + if (current instanceof SearchableConfigurable) { + props.setValue(LAST_SELECTED_CONFIGURABLE, ((SearchableConfigurable)current).getId()); } - - public IdeSettingsDialog(Project project, ConfigurableGroup[] groups, @NotNull String preselectedConfigurableDisplayName) { - super(project, true); - init(project, groups, getPreselectedByDisplayName(groups, preselectedConfigurableDisplayName, project)); + else { + props.setValue(LAST_SELECTED_CONFIGURABLE, current.getClass().getName()); } + } - private void init(final Project project, final ConfigurableGroup[] groups, @Nullable final Configurable preselected) { - myProject = project; - myGroups = groups; - myPreselected = preselected; + @Nullable + private static Configurable findLastSavedConfigurable(ConfigurableGroup[] groups, final Project project) { + final String id = PropertiesComponent.getInstance(project).getValue(LAST_SELECTED_CONFIGURABLE); + if (id == null) return null; - setTitle(CommonBundle.settingsTitle()); + return findConfigurableInGroups(id, groups); + } - init(); - } - - @Nullable - private static Configurable getPreselectedByDisplayName(final ConfigurableGroup[] groups, final String preselectedConfigurableDisplayName, - final Project project) { - Configurable result = findPreselectedByDisplayName(preselectedConfigurableDisplayName, groups); - - return result == null ? findLastSavedConfigurable(groups, project) : result; - } - - @Override - public boolean isTypeAheadEnabled() { - return true; - } - - protected JComponent createCenterPanel() { - myEditor = new OptionsEditor(myProject, myGroups, myPreselected); - myEditor.getContext().addColleague(new OptionsEditorColleague.Adapter() { - @Override - public ActionCallback onModifiedAdded(final Configurable configurable) { - updateStatus(); - return new ActionCallback.Done(); + @Nullable + private static Configurable findConfigurableInGroups(String id, Configurable.Composite... groups) { + // avoid unnecessary group expand: check top-level configurables in all groups before looking at children + for (Configurable.Composite group : groups) { + final Configurable[] configurables = group.getConfigurables(); + for (Configurable c : configurables) { + if (c instanceof SearchableConfigurable && id.equals(((SearchableConfigurable)c).getId())) { + return c; } - - @Override - public ActionCallback onModifiedRemoved(final Configurable configurable) { - updateStatus(); - return new ActionCallback.Done(); + else if (id.equals(c.getClass().getName())) { + return c; } - - @Override - public ActionCallback onErrorsChanged() { - updateStatus(); - return new ActionCallback.Done(); + } + } + for (Configurable.Composite group : groups) { + final Configurable[] configurables = group.getConfigurables(); + for (Configurable c : configurables) { + if (c instanceof Configurable.Composite) { + Configurable result = findConfigurableInGroups(id, (Configurable.Composite)c); + if (result != null) { + return result; + } } - }); - Disposer.register(myDisposable, myEditor); + } + } + return null; + } + + @Nullable + private static Configurable findPreselectedByDisplayName(final String preselectedConfigurableDisplayName, ConfigurableGroup[] groups) { + final List all = SearchUtil.expand(groups); + for (Configurable each : all) { + if (preselectedConfigurableDisplayName.equals(each.getDisplayName())) return each; + } + return null; + } + + @Override + public void doCancelAction(final AWTEvent source) { + if (source instanceof KeyEvent || source instanceof ActionEvent) { + if (myEditor.getContext().isHoldingFilter()) { + myEditor.clearFilter(); + return; + } + } + + super.doCancelAction(source); + } + + @Override + public void doCancelAction() { + saveCurrentConfigurable(); + super.doCancelAction(); + } + + @NotNull + @Override + protected Action[] createActions() { + myApplyAction = new ApplyAction(); + return new Action[]{getOKAction(), getCancelAction(), myApplyAction, getHelpAction()}; + } + + @Override + protected void doHelpAction() { + final String topic = myEditor.getHelpTopic(); + if (topic != null) { + HelpManager.getInstance().invokeHelp(topic); + } + } + + @Override + public JComponent getPreferredFocusedComponent() { + return myEditor.getPreferredFocusedComponent(); + } + + public Object getData(@NonNls String dataId) { + if (OptionsEditor.KEY.is(dataId)) { return myEditor; } + return null; + } - public boolean updateStatus() { - myApplyAction.setEnabled(myEditor.canApply()); - - final Map errors = myEditor.getContext().getErrors(); - if (errors.size() == 0) { - setErrorText(null); - } else { - String text = "Changes were not applied because of an error"; - - final String errorMessage = getErrorMessage(errors); - if (errorMessage != null) { - text += "
" + errorMessage; - } - - setErrorText(text); - } - - return errors.size() == 0; + private class ApplyAction extends AbstractAction { + public ApplyAction() { + super(CommonBundle.getApplyButtonText()); + setEnabled(false); } - @Nullable - private static String getErrorMessage(final Map errors) { - final Collection values = errors.values(); - final ConfigurationException[] exceptions = values.toArray(new ConfigurationException[values.size()]); - if (exceptions.length > 0) { - return exceptions[0].getMessage(); - } - return null; - } - - @Override - protected String getDimensionServiceKey() { - return DIMENSION_KEY; - } - - @Override - protected void doOKAction() { - myEditor.flushModifications(); - - if (myEditor.canApply()) { - myEditor.apply(); - if (!updateStatus()) return; - } - - saveCurrentConfigurable(); - - ApplicationManager.getApplication().saveAll(); - - super.doOKAction(); - } - - - private void saveCurrentConfigurable() { - final Configurable current = myEditor.getContext().getCurrentConfigurable(); - if (current == null) return; - - final PropertiesComponent props = PropertiesComponent.getInstance(myProject); - - if (current instanceof SearchableConfigurable) { - props.setValue(LAST_SELECTED_CONFIGURABLE, ((SearchableConfigurable)current).getId()); - } else { - props.setValue(LAST_SELECTED_CONFIGURABLE, current.getClass().getName()); - } - } - - @Nullable - private static Configurable findLastSavedConfigurable(ConfigurableGroup[] groups, final Project project) { - final String id = PropertiesComponent.getInstance(project).getValue(LAST_SELECTED_CONFIGURABLE); - if (id == null) return null; - - return findConfigurableInGroups(id, groups); - } - - @Nullable - private static Configurable findConfigurableInGroups(String id, Configurable.Composite... groups) { - // avoid unnecessary group expand: check top-level configurables in all groups before looking at children - for (Configurable.Composite group : groups) { - final Configurable[] configurables = group.getConfigurables(); - for (Configurable c : configurables) { - if (c instanceof SearchableConfigurable && id.equals(((SearchableConfigurable)c).getId())) { - return c; - } else if (id.equals(c.getClass().getName())) { - return c; - } - } - } - for (Configurable.Composite group : groups) { - final Configurable[] configurables = group.getConfigurables(); - for (Configurable c : configurables) { - if (c instanceof Configurable.Composite) { - Configurable result = findConfigurableInGroups(id, (Configurable.Composite)c); - if (result != null) { - return result; - } - } - } - } - return null; - } - - @Nullable - private static Configurable findPreselectedByDisplayName(final String preselectedConfigurableDisplayName, ConfigurableGroup[] groups) { - final List all = SearchUtil.expand(groups); - for (Configurable each : all) { - if (preselectedConfigurableDisplayName.equals(each.getDisplayName())) return each; - } - return null; - } - - @Override - public void doCancelAction(final AWTEvent source) { - if (source instanceof KeyEvent || source instanceof ActionEvent) { - if (myEditor.getContext().isHoldingFilter()) { - myEditor.clearFilter(); - return; - } - } - - super.doCancelAction(source); - } - - @Override - public void doCancelAction() { - saveCurrentConfigurable(); - super.doCancelAction(); - } - - @NotNull - @Override - protected Action[] createActions() { - myApplyAction = new ApplyAction(); - return new Action[] {getOKAction(), getCancelAction(), myApplyAction, getHelpAction()}; - } - - @Override - protected void doHelpAction() { - final String topic = myEditor.getHelpTopic(); - if (topic != null) { - HelpManager.getInstance().invokeHelp(topic); - } - } - - @Override - public JComponent getPreferredFocusedComponent() { - return myEditor.getPreferredFocusedComponent(); - } - - public Object getData(@NonNls String dataId) { - if (OptionsEditor.KEY.is(dataId)) { - return myEditor; - } - return null; - } - - private class ApplyAction extends AbstractAction { - public ApplyAction() { - super(CommonBundle.getApplyButtonText()); - setEnabled(false); - } - - public void actionPerformed(final ActionEvent e) { - myEditor.apply(); - myEditor.revalidate(); - myEditor.repaint(); - } + public void actionPerformed(final ActionEvent e) { + myEditor.apply(); + myEditor.revalidate(); + myEditor.repaint(); } + } } From 05cf756731c29174979eeeda51580a5b7e082f01 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 18:01:17 +0200 Subject: [PATCH 70/97] side panel bg for search field --- .../intellij/openapi/options/newEditor/OptionsEditor.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java index 55e254d026fa..1505f098fd2f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java @@ -58,6 +58,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.*; import java.beans.PropertyChangeEvent; @@ -1007,6 +1008,10 @@ public class OptionsEditor extends JPanel implements DataProvider, Place.Navigat private MySearchField() { super(false); addKeyListener(new KeyAdapter() {}); + if (Registry.is("ide.new.settings.dialog")) { + setBackground(UIUtil.getSidePanelColor()); + setBorder(new EmptyBorder(5, 10, 2, 10)); + } } @Override From 214ee160fe59811de9a159a22d9e21f4b4fced67 Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Mon, 25 Aug 2014 20:20:25 +0400 Subject: [PATCH 71/97] CPP-618 Add possibility to run CLion as desktop app on Ubuntu --- .../ide/customize/CustomizeDesktopEntryStep.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/ide/customize/CustomizeDesktopEntryStep.java b/platform/platform-impl/src/com/intellij/ide/customize/CustomizeDesktopEntryStep.java index d61c356cffd1..38a2c21aac2d 100644 --- a/platform/platform-impl/src/com/intellij/ide/customize/CustomizeDesktopEntryStep.java +++ b/platform/platform-impl/src/com/intellij/ide/customize/CustomizeDesktopEntryStep.java @@ -19,8 +19,10 @@ import com.intellij.ide.actions.CreateDesktopEntryAction; import com.intellij.idea.ActionsBundle; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.progress.EmptyProgressIndicator; +import com.intellij.openapi.util.IconLoader; import com.intellij.util.ui.GridBag; import com.intellij.util.ui.UIUtil; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.ChangeEvent; @@ -34,7 +36,7 @@ public class CustomizeDesktopEntryStep extends AbstractCustomizeWizardStep { private final JCheckBox myCreateEntryCheckBox = new JCheckBox(ActionsBundle.message("action.CreateDesktopEntry.description")); private final JCheckBox myGlobalEntryCheckBox = new JCheckBox("For all users"); - public CustomizeDesktopEntryStep() { + public CustomizeDesktopEntryStep(@Nullable String iconPath) { setLayout(new GridBagLayout()); GridBag gbc = @@ -45,6 +47,11 @@ public class CustomizeDesktopEntryStep extends AbstractCustomizeWizardStep { gbc.nextLine().insets.left = UIUtil.PANEL_REGULAR_INSETS.left; add(myGlobalEntryCheckBox, gbc); + if (iconPath != null) { + gbc.nextLine().insets.top = UIUtil.LARGE_VGAP; + add(new JLabel(IconLoader.getIcon(iconPath)), gbc.anchor(GridBagConstraints.CENTER)); + } + add(Box.createVerticalGlue(), gbc.nextLine().weighty(1)); myCreateEntryCheckBox.addChangeListener(new ChangeListener() { From 95dad0f3f60620e65d49644b7beed082ab697af2 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 25 Aug 2014 20:45:49 +0400 Subject: [PATCH 72/97] notify user if fix all failed to start any fix (IDEA-41911) --- .../intention/IntentionManager.java | 8 +++++ .../daemon/impl/HighlightInfo.java | 31 +++-------------- .../impl/config/IntentionManagerImpl.java | 33 +++++++++++++++++-- .../actions/CleanupInspectionIntention.java | 11 ++++++- 4 files changed, 53 insertions(+), 30 deletions(-) rename platform/{analysis-impl => lang-impl}/src/com/intellij/codeInspection/actions/CleanupInspectionIntention.java (91%) diff --git a/platform/analysis-api/src/com/intellij/codeInsight/intention/IntentionManager.java b/platform/analysis-api/src/com/intellij/codeInsight/intention/IntentionManager.java index aeb671df1e84..8aea24650b22 100644 --- a/platform/analysis-api/src/com/intellij/codeInsight/intention/IntentionManager.java +++ b/platform/analysis-api/src/com/intellij/codeInsight/intention/IntentionManager.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.intention; import com.intellij.codeInsight.daemon.HighlightDisplayKey; import com.intellij.codeInspection.LocalQuickFix; +import com.intellij.codeInspection.ex.InspectionToolWrapper; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.project.Project; @@ -24,6 +25,7 @@ import com.intellij.openapi.util.Key; import com.intellij.openapi.util.UserDataHolder; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -125,6 +127,12 @@ public abstract class IntentionManager { @NotNull public abstract List getStandardIntentionOptions(@NotNull HighlightDisplayKey displayKey, @NotNull PsiElement context); + /** + * @return "Fix all '' inspections problems for a file" intention if toolWrapper is local inspection or simple global one + */ + @Nullable + public abstract IntentionAction createFixAllIntention(InspectionToolWrapper toolWrapper, IntentionAction action); + /** * Wraps given action in a LocalQuickFix object. * @param action action to convert. diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightInfo.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightInfo.java index 62e4fddc0ea3..88f230f8f2d3 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightInfo.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightInfo.java @@ -21,11 +21,9 @@ import com.intellij.codeInsight.daemon.HighlightDisplayKey; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.intention.IntentionManager; import com.intellij.codeInspection.*; -import com.intellij.codeInspection.actions.CleanupInspectionIntention; import com.intellij.codeInspection.ex.GlobalInspectionToolWrapper; import com.intellij.codeInspection.ex.InspectionToolWrapper; import com.intellij.codeInspection.ex.LocalInspectionToolWrapper; -import com.intellij.codeInspection.ex.QuickFixWrapper; import com.intellij.lang.ASTNode; import com.intellij.lang.annotation.Annotation; import com.intellij.lang.annotation.HighlightSeverity; @@ -793,7 +791,8 @@ public class HighlightInfo implements Segment { if (options != null || key == null) { return options; } - List newOptions = IntentionManager.getInstance().getStandardIntentionOptions(key, element); + IntentionManager intentionManager = IntentionManager.getInstance(); + List newOptions = intentionManager.getStandardIntentionOptions(key, element); InspectionProfile profile = InspectionProjectProfileManager.getInstance(element.getProject()).getInspectionProfile(); InspectionToolWrapper toolWrapper = profile.getInspectionTool(key.toString(), element); if (!(toolWrapper instanceof LocalInspectionToolWrapper)) { @@ -806,29 +805,9 @@ public class HighlightInfo implements Segment { myCanCleanup = toolWrapper.isCleanupTool(); - InspectionProfileEntry wrappedTool; - if (toolWrapper instanceof LocalInspectionToolWrapper) { - wrappedTool = ((LocalInspectionToolWrapper)toolWrapper).getTool(); - Class aClass = myAction.getClass(); - if (myAction instanceof QuickFixWrapper) { - aClass = ((QuickFixWrapper)myAction).getFix().getClass(); - } - newOptions.add(new CleanupInspectionIntention(toolWrapper, aClass)); - } - else if (toolWrapper instanceof GlobalInspectionToolWrapper) { - wrappedTool = ((GlobalInspectionToolWrapper)toolWrapper).getTool(); - if (wrappedTool instanceof GlobalSimpleInspectionTool && (myAction instanceof LocalQuickFix || myAction instanceof QuickFixWrapper)) { - Class aClass = myAction.getClass(); - if (myAction instanceof QuickFixWrapper) { - aClass = ((QuickFixWrapper)myAction).getFix().getClass(); - } - newOptions.add(new CleanupInspectionIntention(toolWrapper, aClass)); - } - } - else { - throw new AssertionError("unknown tool: " + toolWrapper+"; key: "+myKey); - } - + ContainerUtil.addIfNotNull(newOptions, intentionManager.createFixAllIntention(toolWrapper, myAction)); + InspectionProfileEntry wrappedTool = toolWrapper instanceof LocalInspectionToolWrapper ? ((LocalInspectionToolWrapper)toolWrapper).getTool() + : ((GlobalInspectionToolWrapper)toolWrapper).getTool(); if (wrappedTool instanceof CustomSuppressableInspectionTool) { final IntentionAction[] suppressActions = ((CustomSuppressableInspectionTool)wrappedTool).getSuppressActions(element); if (suppressActions != null) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/config/IntentionManagerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/config/IntentionManagerImpl.java index 46842af23c34..ca0a51112f98 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/config/IntentionManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/config/IntentionManagerImpl.java @@ -20,12 +20,13 @@ import com.intellij.codeInsight.daemon.HighlightDisplayKey; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.intention.IntentionActionBean; import com.intellij.codeInsight.intention.IntentionManager; +import com.intellij.codeInspection.GlobalInspectionTool; +import com.intellij.codeInspection.GlobalSimpleInspectionTool; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.codeInspection.actions.CleanupInspectionIntention; import com.intellij.codeInspection.actions.RunInspectionIntention; -import com.intellij.codeInspection.ex.DisableInspectionToolAction; -import com.intellij.codeInspection.ex.EditInspectionToolsSettingsAction; -import com.intellij.codeInspection.ex.EditInspectionToolsSettingsInSuppressedPlaceIntention; +import com.intellij.codeInspection.ex.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.ExtensionPoint; @@ -181,6 +182,32 @@ public class IntentionManagerImpl extends IntentionManager { return options; } + @Nullable + @Override + public IntentionAction createFixAllIntention(InspectionToolWrapper toolWrapper, IntentionAction action) { + if (toolWrapper instanceof LocalInspectionToolWrapper) { + Class aClass = action.getClass(); + if (action instanceof QuickFixWrapper) { + aClass = ((QuickFixWrapper)action).getFix().getClass(); + } + return new CleanupInspectionIntention(toolWrapper, aClass, action.getText()); + } + else if (toolWrapper instanceof GlobalInspectionToolWrapper) { + GlobalInspectionTool wrappedTool = ((GlobalInspectionToolWrapper)toolWrapper).getTool(); + if (wrappedTool instanceof GlobalSimpleInspectionTool && (action instanceof LocalQuickFix || action instanceof QuickFixWrapper)) { + Class aClass = action.getClass(); + if (action instanceof QuickFixWrapper) { + aClass = ((QuickFixWrapper)action).getFix().getClass(); + } + return new CleanupInspectionIntention(toolWrapper, aClass, action.getText()); + } + } + else { + throw new AssertionError("unknown tool: " + toolWrapper); + } + return null; + } + @Override @NotNull public LocalQuickFix convertToFix(@NotNull final IntentionAction action) { diff --git a/platform/analysis-impl/src/com/intellij/codeInspection/actions/CleanupInspectionIntention.java b/platform/lang-impl/src/com/intellij/codeInspection/actions/CleanupInspectionIntention.java similarity index 91% rename from platform/analysis-impl/src/com/intellij/codeInspection/actions/CleanupInspectionIntention.java rename to platform/lang-impl/src/com/intellij/codeInspection/actions/CleanupInspectionIntention.java index d28c9a3874f5..b6a68ef88fb0 100644 --- a/platform/analysis-impl/src/com/intellij/codeInspection/actions/CleanupInspectionIntention.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/actions/CleanupInspectionIntention.java @@ -17,6 +17,7 @@ package com.intellij.codeInspection.actions; import com.intellij.codeInsight.FileModificationService; +import com.intellij.codeInsight.hint.HintManager; import com.intellij.codeInsight.intention.EmptyIntentionAction; import com.intellij.codeInsight.intention.HighPriorityAction; import com.intellij.codeInsight.intention.IntentionAction; @@ -46,10 +47,12 @@ import java.util.List; public class CleanupInspectionIntention implements IntentionAction, HighPriorityAction { private final InspectionToolWrapper myToolWrapper; private final Class myQuickfixClass; + private final String myText; - public CleanupInspectionIntention(@NotNull InspectionToolWrapper toolWrapper, @NotNull Class quickFixClass) { + public CleanupInspectionIntention(@NotNull InspectionToolWrapper toolWrapper, @NotNull Class quickFixClass, String text) { myToolWrapper = toolWrapper; myQuickfixClass = quickFixClass; + myText = text; } @Override @@ -84,6 +87,7 @@ public class CleanupInspectionIntention implements IntentionAction, HighPriority return d2.getTextRange().getStartOffset() - d1.getTextRange().getStartOffset(); } }); + boolean applicableFixFound = false; for (final ProblemDescriptor descriptor : descriptions) { final QuickFix[] fixes = descriptor.getFixes(); if (fixes != null && fixes.length > 0) { @@ -91,6 +95,7 @@ public class CleanupInspectionIntention implements IntentionAction, HighPriority if (fix != null && fix.getClass().isAssignableFrom(myQuickfixClass)) { final PsiElement element = descriptor.getPsiElement(); if (element != null && element.isValid()) { + applicableFixFound = true; ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { @@ -104,6 +109,10 @@ public class CleanupInspectionIntention implements IntentionAction, HighPriority } } } + + if (!applicableFixFound) { + HintManager.getInstance().showErrorHint(editor, "Unfortunately '" + myText + "' is currently not available for batch mode"); + } } @Override From b64fc59124ce2974c429265d05aad33f46418cdb Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 18:13:45 +0200 Subject: [PATCH 73/97] less contrast fg in options tree --- .../intellij/openapi/options/newEditor/SettingsTreeView.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java index e4777939ab60..166851f8bb77 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java @@ -475,6 +475,11 @@ final class SettingsTreeView extends JComponent implements Disposable, OptionsEd return UIUtil.getSidePanelColor(); } + @Override + protected Color getForeground() { + return new JBColor(Gray._60, Gray._140); + } + @Override protected void layout() { myNodeIcon = new JLabel(" ", SwingConstants.RIGHT); From 889ce2dcfb027ec32a75f6e0826b685cbf33f6fe Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 18:29:19 +0200 Subject: [PATCH 74/97] sometimes renderer paints everything in selection color --- .../openapi/options/newEditor/SettingsTreeView.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java index 166851f8bb77..5809c443469a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java @@ -36,6 +36,7 @@ import com.intellij.util.ArrayUtil; import com.intellij.util.ui.GraphicsUtil; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.tree.TreeUtil; +import com.intellij.util.ui.tree.WideSelectionTreeUI; import com.intellij.util.ui.update.MergingUpdateQueue; import com.intellij.util.ui.update.Update; import org.jetbrains.annotations.NotNull; @@ -47,7 +48,6 @@ import javax.swing.event.TreeExpansionListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.plaf.TreeUI; -import javax.swing.plaf.basic.BasicTreeUI; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; @@ -96,6 +96,9 @@ final class SettingsTreeView extends JComponent implements Disposable, OptionsEd myTree.setShowsRootHandles(false); myScroller = ScrollPaneFactory.createScrollPane(myTree, true); + myScroller.setBackground(UIUtil.getSidePanelColor()); + myScroller.getViewport().setBackground(UIUtil.getSidePanelColor()); + myScroller.getVerticalScrollBar().setBackground(UIUtil.getSidePanelColor()); add(myScroller); myTree.addComponentListener(new ComponentAdapter() { @@ -498,8 +501,11 @@ final class SettingsTreeView extends JComponent implements Disposable, OptionsEd boolean leaf, int row, boolean focused) { - myTextLabel.setOpaque(selected); + myTextLabel.setOpaque(true); + myNodeIcon.setOpaque(true); myTextLabel.setFont(UIUtil.getLabelFont()); + myNodeIcon.setBackground(selected ? UIUtil.getTreeSelectionBackground() : UIUtil.getSidePanelColor()); + myRendererComponent.setBackground(selected ? UIUtil.getTreeSelectionBackground() : UIUtil.getSidePanelColor()); String text; boolean hasSeparatorAbove = false; @@ -728,7 +734,7 @@ final class SettingsTreeView extends JComponent implements Disposable, OptionsEd super.processMouseEvent(e); } - private final class MyTreeUi extends BasicTreeUI { + private final class MyTreeUi extends WideSelectionTreeUI { @Override public void toggleExpandState(TreePath path) { From e5d7b8eba7e6b3b8aef111779a2f7118d1d800bb Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 18:59:16 +0200 Subject: [PATCH 75/97] add one pixel splitter --- .../com/intellij/openapi/options/newEditor/OptionsEditor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java index 1505f098fd2f..443e5ee5f40b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java @@ -38,6 +38,7 @@ import com.intellij.openapi.util.EdtRunnable; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.wm.IdeGlassPaneUtil; import com.intellij.ui.LightColors; +import com.intellij.ui.OnePixelSplitter; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.SearchTextField; import com.intellij.ui.components.labels.LinkLabel; @@ -248,7 +249,7 @@ public class OptionsEditor extends JPanel implements DataProvider, Place.Navigat setLayout(new BorderLayout()); - myMainSplitter = new Splitter(false); + myMainSplitter = Registry.is("ide.new.settings.dialog") ? new OnePixelSplitter(false) : new Splitter(false); myMainSplitter.setFirstComponent(myLeftSide); myLoadingDecorator = new LoadingDecorator(myOwnDetails.getComponent(), this, 150); From 77a369a175664a74ce3496c82bad47f7ae3a4607 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 19:00:20 +0200 Subject: [PATCH 76/97] don't paint header --- .../intellij/openapi/ui/DetailsComponent.java | 86 ++++++++++--------- 1 file changed, 47 insertions(+), 39 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/ui/DetailsComponent.java b/platform/platform-api/src/com/intellij/openapi/ui/DetailsComponent.java index 463d950ae900..00440b0dd8a6 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/DetailsComponent.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/DetailsComponent.java @@ -17,6 +17,7 @@ package com.intellij.openapi.ui; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.registry.Registry; import com.intellij.ui.components.panels.NonOpaquePanel; import com.intellij.ui.components.panels.Wrapper; import com.intellij.util.ArrayUtil; @@ -65,47 +66,54 @@ public class DetailsComponent { protected void paintComponent(final Graphics g) { if (NullableComponent.Check.isNull(myContent) || !myDetailsEnabled) return; - GraphicsConfig c = new GraphicsConfig(g); - c.setAntialiasing(true); + GraphicsConfig c = null; + Insets insets = null; + final int leftX; + final int rightX; + final int rightY; + if (!Registry.is("ide.new.settings.dialog")) { + c = new GraphicsConfig(g); + c.setAntialiasing(true); - Insets insets = getInsets(); - if (insets == null) { - insets = new Insets(0, 0, 0, 0); + insets = getInsets(); + if (insets == null) { + insets = new Insets(0, 0, 0, 0); + } + + g.setColor(UIUtil.getFocusedFillColor()); + + final Rectangle banner = myBanner.getBounds(); + final GeneralPath header = new GeneralPath(); + + leftX = insets.left; + final int leftY = insets.top; + rightX = insets.left + getWidth() - 1 - insets.right; + rightY = banner.y + banner.height; + + header.moveTo(leftX, rightY); + int arc = 8; + header.lineTo(leftX, leftY + arc); + header.quadTo(leftX, leftY, leftX + arc, leftY); + header.lineTo(rightX - arc, leftY); + header.quadTo(rightX, leftY, rightX, leftY + arc); + header.lineTo(rightX, rightY); + header.closePath(); + + c.getG().fill(header); + + g.setColor(UIUtil.getFocusedBoundsColor()); + + c.getG().draw(header); + + + if (myPaintBorder) { + final int down = getHeight() - insets.top - insets.bottom - 1; + g.drawLine(leftX, rightY, leftX, down); + g.drawLine(rightX, rightY, rightX, down); + g.drawLine(leftX, down, rightX, down); + } + c.restore(); } - - g.setColor(UIUtil.getFocusedFillColor()); - - final Rectangle banner = myBanner.getBounds(); - final GeneralPath header = new GeneralPath(); - - final int leftX = insets.left; - final int leftY = insets.top; - final int rightX = insets.left + getWidth() - 1 - insets.right; - final int rightY = banner.y + banner.height; - - header.moveTo(leftX, rightY); - int arc = 8; - header.lineTo(leftX, leftY + arc); - header.quadTo(leftX, leftY, leftX + arc, leftY); - header.lineTo(rightX - arc, leftY); - header.quadTo(rightX, leftY, rightX, leftY + arc); - header.lineTo(rightX, rightY); - header.closePath(); - - c.getG().fill(header); - - g.setColor(UIUtil.getFocusedBoundsColor()); - - c.getG().draw(header); - - if (myPaintBorder) { - final int down = getHeight() - insets.top - insets.bottom - 1; - g.drawLine(leftX, rightY, leftX, down); - g.drawLine(rightX, rightY, rightX, down); - g.drawLine(leftX, down, rightX, down); - } - - c.restore(); } }; From e678e9e93e780209130daaf8d3654c5d7e68dc93 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 19:21:52 +0200 Subject: [PATCH 77/97] fix right offset --- platform/platform-api/src/com/intellij/openapi/ui/Banner.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/platform-api/src/com/intellij/openapi/ui/Banner.java b/platform/platform-api/src/com/intellij/openapi/ui/Banner.java index 8dbe02228bae..59f99ad46a05 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/Banner.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/Banner.java @@ -18,6 +18,7 @@ package com.intellij.openapi.ui; import com.intellij.icons.AllIcons; import com.intellij.openapi.options.OptionsBundle; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.registry.Registry; import com.intellij.ui.components.labels.LinkLabel; import com.intellij.ui.components.labels.LinkListener; import com.intellij.ui.components.panels.NonOpaquePanel; @@ -45,7 +46,7 @@ class Banner extends NonOpaquePanel implements PropertyChangeListener{ public Banner() { setLayout(new BorderLayout()); - setBorder(new EmptyBorder(2, 6, 2, 4)); + setBorder(new EmptyBorder(2, Registry.is("ide.new.settings.dialog") ? 12 : 6, 2, 4)); myProjectIcon.setVisible(false); myProjectIcon.setBorder(new EmptyBorder(0, 12, 0, 4)); From 274296fd51196e2a963f84d8d4743437c10924b9 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 19:30:50 +0200 Subject: [PATCH 78/97] + createTransparent() --- .../com/intellij/util/ui/ButtonlessScrollBarUI.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/platform/platform-api/src/com/intellij/util/ui/ButtonlessScrollBarUI.java b/platform/platform-api/src/com/intellij/util/ui/ButtonlessScrollBarUI.java index d73e21e8dc3a..704dfcde5001 100644 --- a/platform/platform-api/src/com/intellij/util/ui/ButtonlessScrollBarUI.java +++ b/platform/platform-api/src/com/intellij/util/ui/ButtonlessScrollBarUI.java @@ -276,6 +276,16 @@ public class ButtonlessScrollBarUI extends BasicScrollBarUI { return new ButtonlessScrollBarUI(); } + + public static BasicScrollBarUI createTransparent() { + return new ButtonlessScrollBarUI() { + @Override + public boolean alwaysShowTrack() { + return false; + } + }; + } + @Override public void installUI(JComponent c) { super.installUI(c); From 4f229cebb3ba6f63a079fc21c4224d270515d89e Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 19:31:14 +0200 Subject: [PATCH 79/97] remove scrollbar bg --- .../intellij/openapi/options/newEditor/SettingsTreeView.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java index 5809c443469a..fa3d08cac414 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java @@ -33,6 +33,7 @@ import com.intellij.ui.treeStructure.SimpleTreeStructure; import com.intellij.ui.treeStructure.filtered.FilteringTreeBuilder; import com.intellij.ui.treeStructure.filtered.FilteringTreeStructure; import com.intellij.util.ArrayUtil; +import com.intellij.util.ui.ButtonlessScrollBarUI; import com.intellij.util.ui.GraphicsUtil; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.tree.TreeUtil; @@ -96,6 +97,7 @@ final class SettingsTreeView extends JComponent implements Disposable, OptionsEd myTree.setShowsRootHandles(false); myScroller = ScrollPaneFactory.createScrollPane(myTree, true); + myScroller.getVerticalScrollBar().setUI(ButtonlessScrollBarUI.createTransparent()); myScroller.setBackground(UIUtil.getSidePanelColor()); myScroller.getViewport().setBackground(UIUtil.getSidePanelColor()); myScroller.getVerticalScrollBar().setBackground(UIUtil.getSidePanelColor()); From d654240c90ca6d004a29d707203552ded916e3f5 Mon Sep 17 00:00:00 2001 From: Alexander Lobas Date: Mon, 25 Aug 2014 21:36:02 +0400 Subject: [PATCH 80/97] CPP-565 CLion Welcome Screen Toolchains step --- .../src/com/intellij/openapi/util/text/StringUtil.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java index e364a8568fda..af8789d69f14 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -96,7 +96,7 @@ public class StringUtil extends StringUtilRt { @Nullable @Override public String fun(@Nullable String s) { - return s == null ? null : s.trim(); + return trim(s); } }; @@ -852,6 +852,11 @@ public class StringUtil extends StringUtilRt { return startsWithConcatenation(string, firstPrefix, secondPrefix, thirdPrefix); } + @Nullable + public static String trim(@Nullable String s) { + return s == null ? null : s.trim(); + } + @NotNull public static String trimEnd(@NotNull String s, @NonNls @NotNull String suffix) { if (s.endsWith(suffix)) { From d1816346024f0fbd7230ad391ed4606bbc71ddc0 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 19:46:13 +0200 Subject: [PATCH 81/97] update icons --- .../icons/src/general/projectConfigurable.png | Bin 122 -> 988 bytes .../src/general/projectConfigurable@2x.png | Bin 1098 -> 1093 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/platform/icons/src/general/projectConfigurable.png b/platform/icons/src/general/projectConfigurable.png index dcbb64a753901e302105865467dee73b13b55bd4..450c1863c2312962f5873a7d7c19cfd3e3ade4af 100644 GIT binary patch literal 988 zcmaJ=O>5LZ7!K5yTBwK$Qb8C~4+`B(X1@~}OPg%$f+=-(q1%ICHko$AHkp`A-L#`iU5b+0i(8+dp>%lcJnGc@ld7t;4cka#3oF5)K zF~o7)aB*5IvH4&;1_#)G=h47nHjU6im6pi@ZJGh*CT&u~py-;5xP(o6<;n*<&T)OG zoJy5ejSI3xT)~VnLgf04&2i%sk#AZJOhFAVI-bJ+eDjtEj;-)>8ACLD71y2V)c}`Q zXDZfe!;)-%;v5){WG3KZYJ$jJ@Ooaw7_1FOPbz}#dZo`r_`4rY&M%hGbNB< z5h6*FpqPZoWP%|Q;fhDiDB*>p9R&@CR^a&5As&bo%^F#z3eTMGrQrHqSubpti4_b+ zrVo)I#wm4xhVg%>>vqv0E#ZB?{}c`@D?WxL9Fpb0Vi&hC8i(>_HNYk%L4}Z|P8DbC zgp#mMe4wh}%$(!dq#2%V!3{$$dLcDE3l}woX99xb*m80*RnW7!TvE;H2o=(jp4Re6 z%x9;jkeb!?4p$@AvWq?1;oAG$d{1uN39io~YdCPOVp|W03tAb=PH!)no_cMr-P=pH zCl@j^FuvEn?zwZsnkQa%yOwRbeUClX>;dcQALb{Ky@-oNZL$)5uHAq7`qxCCxA7|f z@y?C@_nR-c^^vu^o43CAXOI4dmtG!tKKNz(-;Q11J#_qG{N9R%8Et*)^36YHw>gIZ delta 92 zcmV-i0Hgoh2YQesRzXQbK~#9!W7v1+?SDL&;s5{t3=A+17L2Lr%9Shsaba{t3|KIx yqKg+V{)b_Ficm1JqW{=TLRQ2;j7bcHdiv9Hy3kr6LUvr6H^PP$#qOJ zFhx!{742e*pFE36X|g@D)Z{oO#mRNdj`e~!&);QWU?}o*aSW-rmDDqH=Wl!F%7((i zS=@6DA8}AU(3HbGv1-Gw1~t7ThM$!$C#fE3yIH>=N@_QUZI}nA@v5C1>m4r|8X8D% zOq^l!_fW@@4U0S_{`Sw^`rN)R;-Hk9iTBMOmQO;phdVz0uMc6LFyVT}W2FWLW`;+n X)mS(1-@Kgzw4TA!)z4*}Q$iB}&e&SJ delta 218 zcmV<0044v$2+9bMNda-ON)!TC5oWic{1lQ{z%lO6&klXe3^e;EE8m;e9(Z%IT!RCwBA+;`{g ze+KdZqocAAoWsOGCBTAg1Ce^L`haRKVnhlfu%EA9y-HS?(Ikv8TuVxrQO!ko4bs-u zhS`V>!{q4~MkIw5O~UB^{=4t~ Date: Mon, 25 Aug 2014 19:51:42 +0200 Subject: [PATCH 82/97] bottom separator --- .../openapi/options/newEditor/IdeSettingsDialog.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java index aa3507b03532..cc6ce54aadac 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java @@ -29,13 +29,17 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.Disposer; +import com.intellij.ui.Gray; import com.intellij.ui.IdeBorderFactory; +import com.intellij.ui.JBColor; +import com.intellij.ui.border.CustomLineBorder; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.border.Border; +import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.ActionEvent; @@ -124,7 +128,8 @@ public class IdeSettingsDialog extends DialogWrapper implements DataProvider { @Override protected JComponent createSouthPanel() { final JComponent panel = super.createSouthPanel(); - panel.setBorder(new EmptyBorder(0, 12, 8, 12)); + CustomLineBorder line = new CustomLineBorder(new JBColor(Gray._153, Gray._80), 1, 0, 0, 0); + panel.setBorder(new CompoundBorder(line, new EmptyBorder(0, 12, 8, 12))); return panel; } From bbe6815a5c699d5e521abfc9adbc96477f984f09 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 25 Aug 2014 18:39:05 +0200 Subject: [PATCH 83/97] IDEA-128733 FindInPath: "Recursively" option with Directory Scope selected doesn't work --- .../com/intellij/find/FindManagerTest.java | 22 +++++++++++++++++++ .../intellij/find/impl/FindInProjectTask.java | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java index e40e2c160822..cf876693e2f7 100644 --- a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java +++ b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java @@ -343,6 +343,28 @@ public class FindManagerTest extends DaemonAnalyzerTestCase { assertSize(2, findUsages(findModel)); } + public void testNonRecursiveDirectory() throws Exception { + VirtualFile root = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(createTempDirectory()); + addSourceContentToRoots(myModule, root); + + VirtualFile foo = createChildDirectory(root, "foo"); + VirtualFile bar = createChildDirectory(foo, "bar"); + createFile(myModule, root, "A.txt", "goo doo"); + createFile(myModule, foo, "A.txt", "goo doo"); + createFile(myModule, bar, "A.txt", "doo goo"); + + FindModel findModel = FindManagerTestUtils.configureFindModel("done"); + findModel.setProjectScope(false); + findModel.setDirectoryName(foo.getPath()); + findModel.setStringToFind("doo"); + + findModel.setWithSubdirectories(true); + assertSize(2, findUsages(findModel)); + + findModel.setWithSubdirectories(false); + assertSize(1, findUsages(findModel)); + } + public void testReplaceRegexp() { FindModel findModel = new FindModel(); findModel.setStringToFind("bug_(?=here)"); diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java index 7e9e71d7a94d..7dfdbbce16d7 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java @@ -421,7 +421,7 @@ class FindInProjectTask { SearchScope customScope = myFindModel.getCustomScope(); GlobalSearchScope scope = myPsiDirectory != null - ? GlobalSearchScopesCore.directoryScope(myPsiDirectory, true) + ? GlobalSearchScopesCore.directoryScope(myPsiDirectory, myFindModel.isWithSubdirectories()) : myModule != null ? myModule.getModuleContentScope() : customScope instanceof GlobalSearchScope From 4d6b4f7e8df085dc1aaf94f43165ce9109cee339 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 25 Aug 2014 19:05:49 +0200 Subject: [PATCH 84/97] IDEA-128047 Add color preview into autocomplete tool --- .../daemon/impl/JavaColorProvider.java | 8 +++- .../lookup/VariableLookupItem.java | 38 ++++++++++++++++++- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/JavaColorProvider.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/JavaColorProvider.java index dfc7169a2777..f74e4431d451 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/JavaColorProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/JavaColorProvider.java @@ -15,7 +15,6 @@ */ package com.intellij.codeInsight.daemon.impl; -import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.editor.ElementColorProvider; import com.intellij.psi.*; import com.intellij.psi.impl.JavaConstantExpressionEvaluator; @@ -32,7 +31,12 @@ import java.awt.*; public class JavaColorProvider implements ElementColorProvider { @Override public Color getColorFrom(@NotNull PsiElement element) { - if (element instanceof PsiNewExpression && element.getLanguage() == JavaLanguage.INSTANCE) { + return getJavaColorFromExpression(element); + } + + @Nullable + public static Color getJavaColorFromExpression(@Nullable PsiElement element) { + if (element instanceof PsiNewExpression) { final PsiNewExpression expr = (PsiNewExpression)element; final PsiType type = expr.getType(); if (type != null) { diff --git a/java/java-impl/src/com/intellij/codeInsight/lookup/VariableLookupItem.java b/java/java-impl/src/com/intellij/codeInsight/lookup/VariableLookupItem.java index 21e32a3e3aeb..5cbe750ce6a6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/lookup/VariableLookupItem.java +++ b/java/java-impl/src/com/intellij/codeInsight/lookup/VariableLookupItem.java @@ -3,10 +3,13 @@ package com.intellij.codeInsight.lookup; import com.intellij.codeInsight.AutoPopupController; import com.intellij.codeInsight.TailType; import com.intellij.codeInsight.completion.*; +import com.intellij.codeInsight.daemon.impl.JavaColorProvider; import com.intellij.codeInsight.daemon.impl.analysis.HighlightControlFlowUtil; import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.RangeMarker; +import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.RecursionManager; import com.intellij.openapi.util.registry.Registry; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; @@ -15,9 +18,11 @@ import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.containers.HashMap; +import com.intellij.util.ui.ColorIcon; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.awt.*; import java.util.Collection; /** @@ -25,10 +30,12 @@ import java.util.Collection; */ public class VariableLookupItem extends LookupItem implements TypedLookupItem, StaticallyImportable { @Nullable private final MemberLookupHelper myHelper; + private Color myColor; - public VariableLookupItem(PsiVariable object) { - super(object, object.getName()); + public VariableLookupItem(PsiVariable var) { + super(var, var.getName()); myHelper = null; + myColor = getInitializerColor(var); } public VariableLookupItem(PsiField field, boolean shouldImport) { @@ -37,6 +44,30 @@ public class VariableLookupItem extends LookupItem implements Typed if (!shouldImport) { forceQualify(); } + myColor = getInitializerColor(field); + } + + private static Color getInitializerColor(@NotNull PsiVariable var) { + PsiElement navigationElement = var.getNavigationElement(); + if (navigationElement instanceof PsiVariable) { + var = (PsiVariable)navigationElement; + } + return getExpressionColor(var.getInitializer()); + } + + private static Color getExpressionColor(@Nullable PsiExpression expression) { + if (expression instanceof PsiReferenceExpression) { + PsiElement target = ((PsiReferenceExpression)expression).resolve(); + if (target instanceof PsiVariable) { + return RecursionManager.doPreventingRecursion(expression, true, new Computable() { + @Override + public Color compute() { + return getExpressionColor(((PsiVariable)target).getInitializer()); + } + }); + } + } + return JavaColorProvider.getJavaColorFromExpression(expression); } @Override @@ -76,6 +107,9 @@ public class VariableLookupItem extends LookupItem implements Typed if (myHelper != null) { myHelper.renderElement(presentation, getAttribute(FORCE_QUALIFY) != null ? Boolean.TRUE : null, getSubstitutor()); } + if (myColor != null) { + presentation.setTypeText("", new ColorIcon(12, myColor)); + } } @Override From 8ba10923ed5fa86ca40b69f430f1b72dcd0a3a44 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 25 Aug 2014 20:05:09 +0200 Subject: [PATCH 85/97] don't close doc popup when typing with an active lookup --- .../codeInsight/documentation/DocumentationManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java index 2b42e70ac250..44cab6a0ac3e 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java @@ -171,7 +171,7 @@ public class DocumentationManager extends DockablePopupManager Date: Mon, 25 Aug 2014 20:05:36 +0200 Subject: [PATCH 86/97] less LookupListener.currentItemChanged events --- .../codeInsight/lookup/impl/LookupImpl.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java index 9a71909fcca8..869886d26523 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java @@ -776,15 +776,13 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable, @Override public void valueChanged(@NotNull ListSelectionEvent e){ - final LookupElement item = getCurrentItem(); - if (oldItem != item && !myList.isEmpty()) { // do not update on temporary model wipe - fireCurrentItemChanged(item); - if (myDisposed) { //a listener may have decided to close us, what can we do? - return; - } + if (!myUpdating) { + final LookupElement item = getCurrentItem(); + fireCurrentItemChanged(oldItem, item); oldItem = item; } } + }); new ClickListener() { @@ -876,9 +874,9 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable, } } - void fireCurrentItemChanged(LookupElement item){ - if (!myListeners.isEmpty()){ - LookupEvent event = new LookupEvent(this, item, (char)0); + private void fireCurrentItemChanged(@Nullable LookupElement oldItem, @Nullable LookupElement currentItem) { + if (oldItem != currentItem && !myListeners.isEmpty()) { + LookupEvent event = new LookupEvent(this, currentItem, (char)0); for (LookupListener listener : myListeners) { listener.currentItemChanged(event); } @@ -1088,6 +1086,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable, public void refreshUi(boolean mayCheckReused, boolean onExplicitAction) { assert !myUpdating; + LookupElement prevItem = getCurrentItem(); myUpdating = true; try { final boolean reused = mayCheckReused && checkReused(); @@ -1100,6 +1099,7 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable, } finally { myUpdating = false; + fireCurrentItemChanged(prevItem, getCurrentItem()); } } From 60e0022628a4e2e59a34566215b4a6c6fc4a97e2 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 25 Aug 2014 20:05:59 +0200 Subject: [PATCH 87/97] hide non-documented external annotations on gutter --- ...ExternalAnnotationsLineMarkerProvider.java | 23 ++++++++++++++++--- .../javadoc/JavaDocInfoGenerator.java | 6 ++++- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java index 182f79c94bce..e373207222ea 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsLineMarkerProvider.java @@ -91,10 +91,27 @@ public class ExternalAnnotationsLineMarkerProvider implements LineMarkerProvider private static boolean hasNonCodeAnnotations(@NotNull PsiModifierListOwner element) { Project project = element.getProject(); PsiAnnotation[] externalAnnotations = ExternalAnnotationsManager.getInstance(project).findExternalAnnotations(element); - if (externalAnnotations != null && externalAnnotations.length > 0) { - return true; + if (externalAnnotations != null) { + for (PsiAnnotation annotation : externalAnnotations) { + if (isVisibleAnnotation(annotation)) { + return true; + } + } } - return InferredAnnotationsManager.getInstance(project).findInferredAnnotations(element).length > 0; + for (PsiAnnotation annotation : InferredAnnotationsManager.getInstance(project).findInferredAnnotations(element)) { + if (isVisibleAnnotation(annotation)) { + return true; + } + } + return false; + } + + private static boolean isVisibleAnnotation(@NotNull PsiAnnotation annotation) { + PsiJavaCodeReferenceElement ref = annotation.getNameReferenceElement(); + if (ref == null) return true; + + PsiElement target = ref.resolve(); + return !(target instanceof PsiClass) || JavaDocInfoGenerator.isDocumentedAnnotationType((PsiClass)target); } @Override diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java index f2b9583c49b0..23ab044569f2 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java @@ -727,7 +727,7 @@ public class JavaDocInfoGenerator { boolean inferred = AnnotationUtil.isInferredAnnotation(annotation); if (resolved instanceof PsiClass) { final PsiClass annotationType = (PsiClass)resolved; - if (AnnotationUtil.isAnnotated(annotationType, "java.lang.annotation.Documented", false)) { + if (isDocumentedAnnotationType(annotationType)) { if (inferred) buffer.append(""); final PsiClassType type = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory().createType(annotationType, PsiSubstitutor.EMPTY); buffer.append("@"); @@ -770,6 +770,10 @@ public class JavaDocInfoGenerator { } } + public static boolean isDocumentedAnnotationType(PsiClass annotationType) { + return AnnotationUtil.isAnnotated(annotationType, "java.lang.annotation.Documented", false); + } + private void generateMethodParameterJavaDoc(@NonNls StringBuilder buffer, PsiParameter parameter, boolean generatePrologueAndEpilogue) { if (generatePrologueAndEpilogue) generatePrologue(buffer); From c8fd43d7ac17f5fa90cf576df4937b1757590dd8 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 25 Aug 2014 20:06:20 +0200 Subject: [PATCH 88/97] less stderr on test failures --- .../intellij/testFramework/LoggedErrorProcessor.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/platform/testFramework/src/com/intellij/testFramework/LoggedErrorProcessor.java b/platform/testFramework/src/com/intellij/testFramework/LoggedErrorProcessor.java index eb7611e4ed9e..1577c7d21744 100644 --- a/platform/testFramework/src/com/intellij/testFramework/LoggedErrorProcessor.java +++ b/platform/testFramework/src/com/intellij/testFramework/LoggedErrorProcessor.java @@ -15,6 +15,7 @@ */ package com.intellij.testFramework; +import com.intellij.openapi.util.text.StringUtil; import org.apache.log4j.Logger; import org.jetbrains.annotations.NotNull; @@ -44,15 +45,10 @@ public class LoggedErrorProcessor { public void processError(String message, Throwable t, String[] details, @NotNull Logger logger) { logger.info(message, t); - System.err.println("ERROR: " + message); - if (t != null) t.printStackTrace(System.err); if (details != null && details.length > 0) { - System.out.println("details: "); - for (String detail : details) { - System.out.println(detail); - } + message += "\n Details:" + StringUtil.join(details, "\n "); } - throw new AssertionError(message); + throw new RuntimeException(message, t); } } From b5ba270a7782bd439676f3ac5cd2b657ca44085a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20C=C3=A9bron?= Date: Mon, 25 Aug 2014 22:08:19 +0200 Subject: [PATCH 89/97] fix compilation --- .../src/com/intellij/codeInsight/lookup/VariableLookupItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/lookup/VariableLookupItem.java b/java/java-impl/src/com/intellij/codeInsight/lookup/VariableLookupItem.java index 5cbe750ce6a6..d1d6691fca51 100644 --- a/java/java-impl/src/com/intellij/codeInsight/lookup/VariableLookupItem.java +++ b/java/java-impl/src/com/intellij/codeInsight/lookup/VariableLookupItem.java @@ -57,7 +57,7 @@ public class VariableLookupItem extends LookupItem implements Typed private static Color getExpressionColor(@Nullable PsiExpression expression) { if (expression instanceof PsiReferenceExpression) { - PsiElement target = ((PsiReferenceExpression)expression).resolve(); + final PsiElement target = ((PsiReferenceExpression)expression).resolve(); if (target instanceof PsiVariable) { return RecursionManager.doPreventingRecursion(expression, true, new Computable() { @Override From 290ec1ff27c6ce48e90ce6a874f71be823352caa Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 25 Aug 2014 22:59:14 +0200 Subject: [PATCH 90/97] additional offset for buttons on mac --- .../intellij/openapi/options/newEditor/IdeSettingsDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java index cc6ce54aadac..03ced8a33825 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java @@ -129,7 +129,7 @@ public class IdeSettingsDialog extends DialogWrapper implements DataProvider { protected JComponent createSouthPanel() { final JComponent panel = super.createSouthPanel(); CustomLineBorder line = new CustomLineBorder(new JBColor(Gray._153, Gray._80), 1, 0, 0, 0); - panel.setBorder(new CompoundBorder(line, new EmptyBorder(0, 12, 8, 12))); + panel.setBorder(new CompoundBorder(line, new EmptyBorder(8, 12, 8, 12))); return panel; } From adae55954a7e71c35c9f5680af67b3c2a8d1ad03 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Tue, 26 Aug 2014 00:43:20 +0200 Subject: [PATCH 91/97] Command-line after debug with exception breakpoints handling. --- .../configurations/GeneralCommandLine.java | 6 +- python/helpers/pydev/pydevd.py | 77 ++++++++++++++++++- python/helpers/pydev/pydevd_frame.py | 6 ++ .../python/console/PyDebugConsoleBuilder.java | 2 +- .../run/PythonScriptCommandLineState.java | 20 +++-- 5 files changed, 100 insertions(+), 11 deletions(-) diff --git a/platform/platform-api/src/com/intellij/execution/configurations/GeneralCommandLine.java b/platform/platform-api/src/com/intellij/execution/configurations/GeneralCommandLine.java index 939680ea372a..63849959f1c1 100644 --- a/platform/platform-api/src/com/intellij/execution/configurations/GeneralCommandLine.java +++ b/platform/platform-api/src/com/intellij/execution/configurations/GeneralCommandLine.java @@ -197,6 +197,10 @@ public class GeneralCommandLine implements UserDataHolder { * @return single-string representation of this command line. */ public String getCommandLineString(@Nullable final String exeName) { + return ParametersList.join(getCommandLineList(exeName)); + } + + public List getCommandLineList(@Nullable final String exeName) { final List commands = new ArrayList(); if (exeName != null) { commands.add(exeName); @@ -208,7 +212,7 @@ public class GeneralCommandLine implements UserDataHolder { commands.add(""); } commands.addAll(myProgramParams.getList()); - return ParametersList.join(commands); + return commands; } /** diff --git a/python/helpers/pydev/pydevd.py b/python/helpers/pydev/pydevd.py index 67a936ea1b46..0209c8635b28 100644 --- a/python/helpers/pydev/pydevd.py +++ b/python/helpers/pydev/pydevd.py @@ -77,7 +77,7 @@ import pydevd_vm_type import pydevd_tracing import pydevd_io from pydevd_additional_thread_info import PyDBAdditionalThreadInfo -from pydevd_custom_frames import CustomFramesContainer, CustomFramesContainerInit +from pydevd_custom_frames import CustomFramesContainer, CustomFramesContainerInit, addCustomFrame import pydevd_dont_trace import pydevd_traceproperty @@ -1549,6 +1549,64 @@ class PyDB: cmd = self.cmdFactory.makeExitMessage() self.writer.addCommand(cmd) + def wait_for_commands(self, globals): + thread = threading.currentThread() + frame = MyFrame() + frame.f_globals = globals + frame.f_locals = globals + frame.f_lineno = -1 + frame.f_code = FCode(setup['file'], setup['file']) + thread_id = GetThreadId(thread) + # frame_id = addCustomFrame(frame, 'todo', GetThreadId(thread)) + cmd = self.cmdFactory.makeThreadSuspendMessage(thread_id, frame, CMD_CONSOLE_EXEC, '') + self.writer.addCommand(cmd) + while True: + self.processInternalCommands() + time.sleep(0.01) + +class MyFrame: + def __init__( + self, + frame, + template_frame_file=None, + template_frame_line=None): + + if template_frame_file is None: + template_frame_file = get_template_file_name(frame) + + self.back_context = frame.f_locals['context'] + self.f_code = FCode('Django Template', template_frame_file) + + if template_frame_line is None: + template_frame_line = get_template_line(frame, template_frame_file) + self.f_lineno = template_frame_line + + self.f_back = frame + self.f_globals = {} + self.f_locals = self.collect_context() + self.f_trace = None + + def collect_context(self): + res = {} + try: + for d in self.back_context.dicts: + res.update(d) + except AttributeError: + pass + return res + + def changeVariable(self, name, value): + for d in self.back_context.dicts: + if DictContains(d, name): + d[name] = value + self.f_locals[name] = value + + +class FCode: + def __init__(self, name, filename): + self.co_name = name + self.co_filename = filename + def set_debug(setup): setup['DEBUG_RECORD_SOCKET_READS'] = True setup['DEBUG_TRACE_BREAKPOINTS'] = 1 @@ -1566,6 +1624,7 @@ def processCommandLine(argv): setup['multiproc'] = False #Used by PyCharm (reuses connection: ssh tunneling) setup['multiprocess'] = False # Used by PyDev (creates new connection to ide) setup['save-signatures'] = False + setup['cmd-line'] = False i = 0 del argv[0] while (i < len(argv)): @@ -1603,6 +1662,9 @@ def processCommandLine(argv): elif (argv[i] == '--save-signatures'): del argv[i] setup['save-signatures'] = True + elif (argv[i] == '--cmd-line'): + del argv[i] + setup['cmd-line'] = True else: raise ValueError("unexpected option " + argv[i]) return setup @@ -2036,6 +2098,11 @@ if __name__ == '__main__': except: pass # It's ok not having stackless there... + debugger = PyDB() + + if setup['cmd-line']: + debugger.cmd_line = True + if fix_app_engine_debug: sys.stderr.write("pydev debugger: google app engine integration enabled\n") curr_dir = os.path.dirname(__file__) @@ -2048,10 +2115,8 @@ if __name__ == '__main__': sys.argv.insert(3, '--automatic_restart=no') sys.argv.insert(4, '--max_module_instances=1') - debugger = PyDB() # Run the dev_appserver debugger.run(setup['file'], None, None, set_trace=False) - else: # as to get here all our imports are already resolved, the psyco module can be # changed and we'll still get the speedups in the debugger, as those functions @@ -2067,7 +2132,6 @@ if __name__ == '__main__': import pydevd_psyco_stub sys.modules['psyco'] = pydevd_psyco_stub - debugger = PyDB() if setup['save-signatures']: if pydevd_vm_type.GetVmType() == pydevd_vm_type.PydevdVmType.JYTHON: @@ -2085,3 +2149,8 @@ if __name__ == '__main__': connected = True # Mark that we're connected when started from inside ide. debugger.run(setup['file'], None, None) + + # if setup['cmd-line']: + # debugger.wait_for_commands(globals) + + diff --git a/python/helpers/pydev/pydevd_frame.py b/python/helpers/pydev/pydevd_frame.py index b7073678bf66..f1c035002bb5 100644 --- a/python/helpers/pydev/pydevd_frame.py +++ b/python/helpers/pydev/pydevd_frame.py @@ -403,6 +403,12 @@ class PyDBFrame: if stop: self.setSuspend(thread, CMD_SET_BREAK) + if event == 'return': + if main_debugger.cmd_line: + base = basename(back.f_code.co_filename) + if base == 'pydevd.py' and back.f_code.co_name == 'run': + self.setSuspend(thread, CMD_SET_BREAK) # we suspend on exit + # if thread has a suspend flag, we suspend with a busy wait if info.pydev_state == STATE_SUSPEND: self.doWaitSuspend(thread, frame, event, arg) diff --git a/python/src/com/jetbrains/python/console/PyDebugConsoleBuilder.java b/python/src/com/jetbrains/python/console/PyDebugConsoleBuilder.java index a99b9332c00d..7fbd432ebf2c 100644 --- a/python/src/com/jetbrains/python/console/PyDebugConsoleBuilder.java +++ b/python/src/com/jetbrains/python/console/PyDebugConsoleBuilder.java @@ -37,7 +37,7 @@ public class PyDebugConsoleBuilder extends TextConsoleBuilder { public PyDebugConsoleBuilder(final Project project, @Nullable Sdk sdk) { myProject = project; - this.mySdk = sdk; + mySdk = sdk; } public ConsoleView getConsole() { diff --git a/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java b/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java index 9ebc5c53afb4..cd92fdb34638 100644 --- a/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java +++ b/python/src/com/jetbrains/python/run/PythonScriptCommandLineState.java @@ -20,6 +20,7 @@ import com.intellij.execution.*; import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.execution.configurations.ParametersList; import com.intellij.execution.configurations.ParamsGroup; +import com.intellij.execution.executors.DefaultDebugExecutor; import com.intellij.execution.process.CommandLineArgumentsProvider; import com.intellij.execution.process.OSProcessHandler; import com.intellij.execution.process.ProcessHandler; @@ -61,10 +62,18 @@ public class PythonScriptCommandLineState extends PythonCommandLineState { @Override public ExecutionResult execute(Executor executor, final CommandLinePatcher... patchers) throws ExecutionException { if (myConfig.showCommandLineAfterwards()) { + if (executor.getId() == DefaultDebugExecutor.EXECUTOR_ID) { + return super.execute(executor, ArrayUtil.append(patchers, new CommandLinePatcher() { + @Override + public void patchCommandLine(GeneralCommandLine commandLine) { + commandLine.getParametersList().getParamsGroup(PythonCommandLineState.GROUP_DEBUGGER).addParameterAt(1, "--cmd-line"); + } + })); + } PydevConsoleRunner runner = new PythonScriptWithConsoleRunner(myConfig.getProject(), myConfig.getSdk(), PyConsoleType.PYTHON, myConfig.getWorkingDirectory(), - myConfig.getEnvs(), patchers); + myConfig.getEnvs(), patchers); runner.runSync(); @@ -109,7 +118,9 @@ public class PythonScriptCommandLineState extends PythonCommandLineState { @NotNull Sdk sdk, @NotNull PyConsoleType consoleType, @Nullable String workingDir, - Map environmentVariables, CommandLinePatcher[] patchers, String... statementsToExecute) { + Map environmentVariables, + CommandLinePatcher[] patchers, + String... statementsToExecute) { super(project, sdk, consoleType, workingDir, environmentVariables, statementsToExecute); myPatchers = patchers; } @@ -124,7 +135,6 @@ public class PythonScriptCommandLineState extends PythonCommandLineState { protected CommandLineArgumentsProvider createCommandLineArgumentsProvider(final Sdk sdk, final Map environmentVariables, int[] ports) { - final ArrayList args = new ArrayList(); args.add(sdk.getHomePath()); final String versionString = sdk.getVersionString(); @@ -139,7 +149,8 @@ public class PythonScriptCommandLineState extends PythonCommandLineState { try { GeneralCommandLine cmd = generateCommandLine(myPatchers); args.addAll(cmd.getParametersList().getList()); - } catch (Exception e) { + } + catch (Exception e) { //pass } return new CommandLineArgumentsProvider() { @@ -158,7 +169,6 @@ public class PythonScriptCommandLineState extends PythonCommandLineState { return addDefaultEnvironments(sdk, environmentVariables); } }; - } } } From c8bda2e3e4e42066a5a41bcf988b726366aa02af Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 26 Aug 2014 01:01:22 +0200 Subject: [PATCH 92/97] new separator color --- .../com/intellij/ide/actions/ShowStructureSettingsAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java b/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java index ded07d482ed3..eeb8d1b95a49 100644 --- a/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java +++ b/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java @@ -56,7 +56,7 @@ public class ShowStructureSettingsAction extends AnAction implements DumbAware { protected JComponent createSouthPanel() { JComponent panel = super.createSouthPanel(); assert panel != null; - CustomLineBorder line = new CustomLineBorder(new JBColor(Gray._153, Gray._80), 1, 0, 0, 0); + CustomLineBorder line = new CustomLineBorder(new JBColor(Gray._153.withAlpha(128), Gray._100.withAlpha(128)), 1, 0, 0, 0); panel.setBorder(new CompoundBorder(line, new EmptyBorder(10, 5, 5, 5))); return panel; } From 5a4fc9cf8f4b22e5d6ce310d3a66dd2c6178ae11 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 26 Aug 2014 01:02:49 +0200 Subject: [PATCH 93/97] Box has white background on Mac --- .../com/intellij/openapi/options/newEditor/OptionsEditor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java index 443e5ee5f40b..2b3aa5bdda1d 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsEditor.java @@ -1201,7 +1201,8 @@ public class OptionsEditor extends JPanel implements DataProvider, Place.Navigat * @return default view for the specified configurable */ private JComponent createDefaultComponent(SearchableConfigurable searchable) { - Box box = Box.createVerticalBox(); + JPanel box = new JPanel(); + box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS)); try { box.add(new JLabel(OptionsBundle.message(searchable.getId() + ".settings.description"))); } From c6012fd399e7886c15ea0f4007a4439ddf7102aa Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 26 Aug 2014 01:03:16 +0200 Subject: [PATCH 94/97] light separator --- .../intellij/openapi/options/newEditor/IdeSettingsDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java index 03ced8a33825..c38bf6ff2033 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/IdeSettingsDialog.java @@ -128,7 +128,7 @@ public class IdeSettingsDialog extends DialogWrapper implements DataProvider { @Override protected JComponent createSouthPanel() { final JComponent panel = super.createSouthPanel(); - CustomLineBorder line = new CustomLineBorder(new JBColor(Gray._153, Gray._80), 1, 0, 0, 0); + CustomLineBorder line = new CustomLineBorder(new JBColor(Gray._153.withAlpha(128), Gray._100.withAlpha(128)), 1, 0, 0, 0); panel.setBorder(new CompoundBorder(line, new EmptyBorder(8, 12, 8, 12))); return panel; } From 8037311b738860e4e628278c6b6604cfcb1e5cfc Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 26 Aug 2014 03:02:36 +0200 Subject: [PATCH 95/97] better painting of spotlight --- .../openapi/options/ex/GlassPanel.java | 52 ++++++++++++++----- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/GlassPanel.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/GlassPanel.java index 96cc9e451185..c80a222ffd96 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/GlassPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/GlassPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,10 @@ package com.intellij.openapi.options.ex; import com.intellij.ide.ui.search.SearchUtil; +import com.intellij.openapi.ui.GraphicsConfig; +import com.intellij.ui.ColorUtil; import com.intellij.ui.components.JBTabbedPane; +import com.intellij.util.ui.GraphicsUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.Nullable; @@ -27,6 +30,7 @@ import java.awt.geom.Area; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; import java.awt.image.Kernel; +import java.util.ArrayList; import java.util.HashSet; import java.util.Set; @@ -64,17 +68,19 @@ public class GlassPanel extends JComponent { final Point leftPoint = SwingUtilities.convertPoint(myPanel, new Point(visibleRect.x, visibleRect.y), surfaceComponent); Area innerPanel = new Area(new Rectangle2D.Double(leftPoint.x, leftPoint.y, visibleRect.width, visibleRect.height)); Area mask = new Area(screen); - + ArrayList components = new ArrayList(); for (JComponent lightComponent : myLightComponents) { - final Area area = getComponentArea(surfaceComponent, lightComponent); + final Area area = getComponentArea(surfaceComponent, lightComponent, 1); if (area == null) continue; + components.add(lightComponent); if (lightComponent instanceof JLabel) { final JLabel label = (JLabel)lightComponent; final Component labelFor = label.getLabelFor(); if (labelFor instanceof JComponent) { - final Area labelForArea = getComponentArea(surfaceComponent, (JComponent)labelFor); + final Area labelForArea = getComponentArea(surfaceComponent, (JComponent)labelFor, 1); if (labelForArea != null) { + components.add((JComponent)labelFor); area.add(labelForArea); } } @@ -86,19 +92,32 @@ public class GlassPanel extends JComponent { Graphics2D g2 = (Graphics2D)g; - Color shieldColor = new Color(0.0f, 0.0f, 0.0f, 0.15f); + Color shieldColor = new Color(0.0f, 0.0f, 0.0f, 0.20f); Color boundsColor = Color.gray; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setColor(shieldColor); g2.fill(mask); - g2.setColor(boundsColor); - g2.draw(mask); + g2.setColor(ColorUtil.toAlpha(Color.orange, 25)); + GraphicsConfig config = GraphicsUtil.setupAAPainting(g2); + for (int i = 2; i > 0; i--) { + g2.setStroke(new BasicStroke(i)); + Area arrr = new Area(); + for (JComponent component : components) { + Area area = getComponentArea(surfaceComponent, component, i-1); + if (area != null) { + arrr.add(area); + } + } + g2.draw(arrr); + } + + config.restore(); } } @Nullable - private Area getComponentArea(final JComponent surfaceComponent, final JComponent lightComponent) { + private Area getComponentArea(final JComponent surfaceComponent, final JComponent lightComponent, int offset) { if (!lightComponent.isShowing()) return null; final Point panelPoint = SwingUtilities.convertPoint(lightComponent, new Point(0, 0), surfaceComponent); @@ -115,12 +134,17 @@ public class GlassPanel extends JComponent { int hInset = isWithBorder ? 7 : isLabelFromTabbedPane ? 20 : 7; int vInset = isWithBorder ? 1 : isLabelFromTabbedPane ? 10 : 5; - final Area area = new Area(new RoundRectangle2D.Double(x - hInset + insetsToIgnore.left, - y - vInset + insetsToIgnore.top, - lightComponent.getWidth() + hInset * 2 - insetsToIgnore.right - insetsToIgnore.left, - lightComponent.getHeight() + vInset * 2 - insetsToIgnore.top - insetsToIgnore.bottom, - 6, 6)); - return area; + hInset += offset; + vInset += offset; + int xCoord = x - hInset + insetsToIgnore.left; + int yCoord = y - vInset + insetsToIgnore.top; + int width = lightComponent.getWidth() + hInset * 2 - insetsToIgnore.right - insetsToIgnore.left; + int height = lightComponent.getHeight() + vInset * 2 - insetsToIgnore.top - insetsToIgnore.bottom; + return new Area(new RoundRectangle2D.Double(xCoord, + yCoord, + width, + height, + Math.min(height, 30), Math.min(height, 30))); } protected static Kernel getBlurKernel(int blurSize) { From 595e1cac285c39846e43acdd8231285bb64e2b99 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 26 Aug 2014 03:20:39 +0200 Subject: [PATCH 96/97] don't paint unfocused tree selection --- .../com/intellij/openapi/options/newEditor/SettingsTreeView.java | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java index fa3d08cac414..c36863e250b3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsTreeView.java @@ -82,6 +82,7 @@ final class SettingsTreeView extends JComponent implements Disposable, OptionsEd myFilter = filter; myRoot = new MyRoot(groups); myTree = new MyTree(); + myTree.putClientProperty(WideSelectionTreeUI.TREE_TABLE_TREE_KEY, Boolean.TRUE); myTree.setBackground(UIUtil.getSidePanelColor()); myTree.getInputMap().clear(); TreeUtil.installActions(myTree); From ebd58967f8fd6c21e326e32cbda85e5d804c7c7f Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 26 Aug 2014 03:21:52 +0200 Subject: [PATCH 97/97] install wide selection tree UI --- .../openapi/options/newEditor/OptionsTree.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsTree.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsTree.java index 18a953593275..aee9e889fdf1 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsTree.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/OptionsTree.java @@ -37,6 +37,7 @@ import com.intellij.ui.treeStructure.filtered.FilteringTreeStructure; import com.intellij.util.ui.GraphicsUtil; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.tree.TreeUtil; +import com.intellij.util.ui.tree.WideSelectionTreeUI; import com.intellij.util.ui.update.MergingUpdateQueue; import com.intellij.util.ui.update.Update; import org.jetbrains.annotations.NotNull; @@ -49,12 +50,14 @@ import javax.swing.event.TreeExpansionListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.plaf.TreeUI; -import javax.swing.plaf.basic.BasicTreeUI; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import java.awt.*; -import java.awt.event.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; import java.util.*; import java.util.List; @@ -403,6 +406,9 @@ public class OptionsTree extends JPanel implements Disposable, OptionsEditorColl } else { myProjectIcon.setVisible(false); } + if (Registry.is("ide.new.settings.dialog")) { + result.setBackground(selected ? UIUtil.getTreeSelectionBackground() : UIUtil.getSidePanelColor()); + } return result; } @@ -727,7 +733,7 @@ public class OptionsTree extends JPanel implements Disposable, OptionsEditorColl super.processMouseEvent(e); } - private class MyTreeUi extends BasicTreeUI { + private class MyTreeUi extends WideSelectionTreeUI { @Override public void toggleExpandState(final TreePath path) {

V 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 EA9b(28~^|S From b39445f3206402468bacb73384cfae86e5ab5be9 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 25 Aug 2014 12:21:06 +0200 Subject: [PATCH 22/97] new "'equals()' called on itself" inspection --- .../src/META-INF/InspectionGadgets.xml | 4 + .../siyeh/InspectionGadgetsBundle.properties | 2 + .../ig/bugs/EqualsWithItselfInspection.java | 75 +++++++++++++++++++ .../EqualsWithItself.html | 10 +++ .../equals_with_itself/EqualsWithItself.java | 23 ++++++ .../bugs/EqualsWithItselfInspectionTest.java | 34 +++++++++ 6 files changed, 148 insertions(+) create mode 100644 plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/EqualsWithItselfInspection.java create mode 100644 plugins/InspectionGadgets/src/inspectionDescriptions/EqualsWithItself.html create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/equals_with_itself/EqualsWithItself.java create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/EqualsWithItselfInspectionTest.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml index c8854d4dbb26..18156bcd9a81 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml @@ -202,6 +202,10 @@ key="equals.between.inconvertible.types.display.name" groupBundle="messages.InspectionsBundle" groupKey="group.names.probable.bugs" enabledByDefault="true" level="WARNING" implementationClass="com.siyeh.ig.bugs.EqualsBetweenInconvertibleTypesInspection"/> + #ref with only 'private' constructors should be declared 'final' property.value.set.to.itself.display.name=Property value set to itself +equals.with.itself.display.name='equals()' called on itself +equals.with.itself.problem.descriptor=Identical qualifier and argument to #ref() call diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/EqualsWithItselfInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/EqualsWithItselfInspection.java new file mode 100644 index 000000000000..7d498b7c5609 --- /dev/null +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/EqualsWithItselfInspection.java @@ -0,0 +1,75 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.siyeh.ig.bugs; + +import com.intellij.psi.PsiExpression; +import com.intellij.psi.PsiExpressionList; +import com.intellij.psi.PsiMethodCallExpression; +import com.intellij.psi.PsiReferenceExpression; +import com.siyeh.InspectionGadgetsBundle;import com.siyeh.ig.BaseInspection; +import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.ig.psiutils.EquivalenceChecker; +import com.siyeh.ig.psiutils.MethodCallUtils; +import com.siyeh.ig.psiutils.SideEffectChecker; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; + +/** + * @author Bas Leijdekkers + */ +public class EqualsWithItselfInspection extends BaseInspection { + @Nls + @NotNull + @Override + public String getDisplayName() { + return InspectionGadgetsBundle.message("equals.with.itself.display.name"); + } + + @NotNull + @Override + protected String buildErrorString(Object... infos) { + return InspectionGadgetsBundle.message("equals.with.itself.problem.descriptor"); + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new EqualsWithIfSelfVisitor(); + } + + private static class EqualsWithIfSelfVisitor extends BaseInspectionVisitor { + + @Override + public void visitMethodCallExpression(PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + if (!MethodCallUtils.isEqualsCall(expression)) { + return; + } + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (qualifier == null) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + final PsiExpression argument = arguments[0]; + if (!EquivalenceChecker.expressionsAreEquivalent(qualifier, argument) || + SideEffectChecker.mayHaveSideEffects(qualifier)) { + return; + } + registerMethodCallError(expression); + } + } +} diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/EqualsWithItself.html b/plugins/InspectionGadgets/src/inspectionDescriptions/EqualsWithItself.html new file mode 100644 index 000000000000..3e1491edd22e --- /dev/null +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/EqualsWithItself.html @@ -0,0 +1,10 @@ + + +Reports call to equals() were an object is compared for equality with itself. +This means that the argument and the qualifier to the call are identical. +In this case equals() will always return true. + +