| #!/usr/bin/env python |
| |
| # Copyright (c) 2001-2004, MetaSlash Inc. All rights reserved. |
| |
| """ |
| Print out warnings from Python source files. |
| """ |
| |
| import sys |
| import string |
| import copy |
| |
| from pychecker import msgs |
| from pychecker import Config |
| from pychecker.Warning import Warning |
| |
| |
| VAR_ARGS_BITS = 8 |
| MAX_ARGS_MASK = ((1 << VAR_ARGS_BITS) - 1) |
| |
| INIT = '__init__' |
| LAMBDA = '<lambda>' |
| |
| # number of instructions to check backwards if it was a return |
| BACK_RETURN_INDEX = 4 |
| |
| |
| _cfg = [] |
| |
| def cfg() : |
| return _cfg[-1] |
| |
| def initConfig(cfg) : |
| _cfg.append(cfg) |
| |
| def pushConfig() : |
| newCfg = copy.copy(cfg()) |
| _cfg.append(newCfg) |
| |
| def popConfig() : |
| del _cfg[-1] |
| |
| |
| def shouldUpdateArgs(operand) : |
| return operand == Config.CHECKER_VAR |
| |
| def updateCheckerArgs(argStr, func, lastLineNum, warnings) : |
| try : |
| argList = string.split(argStr) |
| # don't require long options to start w/--, we can add that for them |
| for i in range(0, len(argList)) : |
| if argList[i][0] != '-' : |
| argList[i] = '--' + argList[i] |
| |
| cfg().processArgs(argList) |
| return 1 |
| except Config.UsageError, detail : |
| warn = Warning(func, lastLineNum, msgs.INVALID_CHECKER_ARGS % detail) |
| warnings.append(warn) |
| return 0 |
| |
| |
| def debug(*args) : |
| if cfg().debug: print args |
| |
| |
| PYTHON_1_5 = 0x10502 |
| PYTHON_2_0 = 0x20000 |
| PYTHON_2_1 = 0x20100 |
| PYTHON_2_2 = 0x20200 |
| PYTHON_2_3 = 0x20300 |
| PYTHON_2_4 = 0x20400 |
| PYTHON_2_5 = 0x20500 |
| PYTHON_2_6 = 0x20600 |
| PYTHON_3_0 = 0x30000 |
| |
| def pythonVersion() : |
| return sys.hexversion >> 8 |
| |
| def startswith(s, substr) : |
| "Ugh, supporting python 1.5 is a pain" |
| return s[0:len(substr)] == substr |
| |
| def endswith(s, substr) : |
| "Ugh, supporting python 1.5 is a pain" |
| return s[-len(substr):] == substr |
| |
| |
| # generic method that can be slapped into any class, thus the self parameter |
| def std_repr(self) : |
| return "<%s at 0x%x: %s>" % (self.__class__.__name__, id(self), safestr(self)) |
| |
| try: |
| unicode, UnicodeError |
| except NameError: |
| class UnicodeError(Exception): pass |
| |
| def safestr(value): |
| try: |
| return str(value) |
| except UnicodeError: |
| return unicode(value) |