summaryrefslogtreecommitdiff
path: root/pylint/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'pylint/utils.py')
-rw-r--r--pylint/utils.py92
1 files changed, 59 insertions, 33 deletions
diff --git a/pylint/utils.py b/pylint/utils.py
index 76afdea09..66b405c8f 100644
--- a/pylint/utils.py
+++ b/pylint/utils.py
@@ -302,11 +302,18 @@ class MessagesHandlerMixIn:
"""If the msgid is a numeric one, then register it to inform the user
it could furnish instead a symbolic msgid."""
try:
- msg = self.msgs_store.get_message_definition(msgid)
- if msgid == msg.msgid:
- MessagesHandlerMixIn.__by_id_managed_msgs.append(
- (self.current_name, msg.msgid, msg.symbol, line, is_disabled)
- )
+ messages = self.msgs_store.get_message_definition(msgid)
+ for message in messages:
+ if msgid == message.msgid:
+ MessagesHandlerMixIn.__by_id_managed_msgs.append(
+ (
+ self.current_name,
+ message.msgid,
+ message.symbol,
+ line,
+ is_disabled,
+ )
+ )
except UnknownMessageError:
pass
@@ -363,12 +370,15 @@ class MessagesHandlerMixIn:
try:
# msgid is a symbolic or numeric msgid.
- msg = self.msgs_store.get_message_definition(msgid)
+ messages = self.msgs_store.get_message_definition(msgid)
except UnknownMessageError:
if ignore_unknown:
return
raise
+ for message in messages:
+ self._set_one_msg_status(scope, message, line, enable)
+ def _set_one_msg_status(self, scope, msg, line, enable):
if scope == "module":
self.file_state.set_msg_status(msg, line, enable)
if not enable and msg.symbol != "locally-disabled":
@@ -395,7 +405,7 @@ class MessagesHandlerMixIn:
exist.
"""
try:
- return self.msgs_store.get_message_definition(msgid).symbol
+ return [s.symbol for s in self.msgs_store.get_message_definition(msgid)]
except UnknownMessageError:
return msgid
@@ -420,12 +430,19 @@ class MessagesHandlerMixIn:
if confidence.name not in self.config.confidence:
return False
try:
- msgid = self.msgs_store.get_message_definition(msg_descr).msgid
+ msgs = self.msgs_store.get_message_definition(msg_descr)
+ msgids = [msg.msgid for msg in msgs]
except UnknownMessageError:
# The linter checks for messages that are not registered
# due to version mismatch, just treat them as message IDs
# for now.
- msgid = msg_descr
+ msgids = [msg_descr]
+ for msgid in msgids:
+ if self.is_one_message_enabled(msgid, line):
+ return True
+ return False
+
+ def is_one_message_enabled(self, msgid, line):
if line is None:
return self._msgs_state.get(msgid, True)
try:
@@ -473,14 +490,18 @@ class MessagesHandlerMixIn:
provide line if the line number is different), raw and token checkers
must provide the line argument.
"""
- msg_info = self.msgs_store.get_message_definition(msg_descr)
- msgid = msg_info.msgid
+ messages = self.msgs_store.get_message_definition(msg_descr)
+ for message in messages:
+ self.add_one_message(message, line, node, args, confidence, col_offset)
+
+ def add_one_message(self, message, line, node, args, confidence, col_offset):
+ msgid = message.msgid
# backward compatibility, message may not have a symbol
- symbol = msg_info.symbol or msgid
+ symbol = message.symbol or msgid
# Fatal messages and reports are special, the node/scope distinction
# does not apply to them.
if msgid[0] not in _SCOPE_EXEMPT:
- if msg_info.scope == WarningScope.LINE:
+ if message.scope == WarningScope.LINE:
if line is None:
raise InvalidMessageError(
"Message %s must provide line, got None" % msgid
@@ -490,7 +511,7 @@ class MessagesHandlerMixIn:
"Message %s must only provide line, "
"got line=%s, node=%s" % (msgid, line, node)
)
- elif msg_info.scope == WarningScope.NODE:
+ elif message.scope == WarningScope.NODE:
# Node-based warnings may provide an override line.
if node is None:
raise InvalidMessageError(
@@ -525,7 +546,7 @@ class MessagesHandlerMixIn:
except KeyError:
self.stats["by_msg"][symbol] = 1
# expand message ?
- msg = msg_info.msg
+ msg = message.msg
if args:
msg %= args
# get module and object
@@ -717,13 +738,15 @@ class FileState:
continue
# Set state for all lines for this block, if the
# warning is applied to nodes.
- if msgs_store.get_message_definition(msgid).scope == WarningScope.NODE:
- if lineno > firstchildlineno:
- state = True
- first_, last_ = node.block_range(lineno)
- else:
- first_ = lineno
- last_ = last
+ messages = msgs_store.get_message_definition(msgid)
+ for message in messages:
+ if message.scope == WarningScope.NODE:
+ if lineno > firstchildlineno:
+ state = True
+ first_, last_ = node.block_range(lineno)
+ else:
+ first_ = lineno
+ last_ = last
for line in range(first_, last_ + 1):
# do not override existing entries
if line in self._module_msgs_state.get(msgid, ()):
@@ -811,7 +834,7 @@ class MessagesStore:
This allows users to keep using the old ID/symbol in suppressions.
"""
- msg = self.get_message_definition(new_symbol)
+ msg = self.get_message_definition(new_symbol)[0]
msg.old_names.append((old_id, old_symbol))
self._register_alternative_name(msg, old_id, old_symbol)
@@ -969,40 +992,43 @@ class MessagesStore:
)
raise InvalidMessageError(error_message)
- def get_message_definition(self, msgid_or_symbol):
+ def get_message_definition(self, msgid_or_symbol: str) -> list:
"""Returns the Message object for this message.
:param str msgid_or_symbol: msgid_or_symbol may be either a numeric or symbolic id.
:raises UnknownMessageError: if the message id is not defined.
- :rtype: MessageDefinition
+ :rtype: List of MessageDefinition
:return: A message definition corresponding to msgid_or_symbol
"""
if msgid_or_symbol[1:].isdigit():
msgid_or_symbol = msgid_or_symbol.upper()
for source in (self._alternative_names, self._messages):
try:
- return source[msgid_or_symbol]
+ return [source[msgid_or_symbol]]
except KeyError:
pass
- raise UnknownMessageError(
- "No such message id {msgid_or_symbol}".format(
- msgid_or_symbol=msgid_or_symbol
- )
+ error_msg = "No such message id or symbol '{msgid_or_symbol}'.".format(
+ msgid_or_symbol=msgid_or_symbol
)
+ raise UnknownMessageError(error_msg)
def get_msg_display_string(self, msgid):
"""Generates a user-consumable representation of a message.
Can be just the message ID or the ID and the symbol.
"""
- return repr(self.get_message_definition(msgid).symbol)
+ msgs = self.get_message_definition(msgid)
+ if len(msgs) == 1:
+ return repr(msgs[0].symbol)
+ return repr([msg.symbol for msg in msgs])
def help_message(self, msgids):
"""Display help messages for the given message identifiers"""
for msgid in msgids:
try:
- print(self.get_message_definition(msgid).format_help(checkerref=True))
- print("")
+ for msg in self.get_message_definition(msgid):
+ print(msg.format_help(checkerref=True))
+ print("")
except UnknownMessageError as ex:
print(ex)
print("")