Skip to content

Commit

Permalink
Disallow multiple base classes (fix #14)
Browse files Browse the repository at this point in the history
  • Loading branch information
JukkaL committed Feb 11, 2013
1 parent efba982 commit 5ad3861
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 3 deletions.
15 changes: 14 additions & 1 deletion mypy/semanal.py
Original file line number Diff line number Diff line change
Expand Up @@ -299,10 +299,23 @@ class SemanticAnalyzer(NodeVisitor):
for t in bt[1:]:
if isinstance(t, Instance):
defn.info.add_interface(((Instance)t).type)
self.verify_base_classes(defn)
defn.defs.accept(self)
self.locals.pop()
self.type, self.class_tvars = self.type_stack.pop()


void verify_base_classes(self, TypeDef defn):
base_classes = <str> []
for base in defn.base_types:
if isinstance(base, Instance):
baseinfo = ((Instance)base).type
if not baseinfo.is_interface:
base_classes.append(baseinfo.name())
if len(base_classes) > 1:
bases = ["'%s'" % n for n in sorted(base_classes)]
self.fail('Class has multiple base classes (%s)' %
(' and '.join(bases)), defn)

Type object_type(self):
sym = self.lookup_qualified('__builtins__.object', None)
return Instance((TypeInfo)sym.node, [])
Expand Down
4 changes: 2 additions & 2 deletions test/data/pythongen.test
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,10 @@ class A<t>:
class A:
pass

[case testGenericBaseClass]
[case testGenericBaseType]
class A(B<object>, C<any, object>):
pass
class B<t>: pass
interface B<t>: pass
class C<t, s>: pass
[out]
class A(B, C):
Expand Down
6 changes: 6 additions & 0 deletions test/data/semanal-errors.test
Original file line number Diff line number Diff line change
Expand Up @@ -503,3 +503,9 @@ class A<t>:
A<t> x # E: Name 't' is not defined
A<s> y # E: Name 's' is not defined
[out]

[case testExtendMultipleClasses]
class A: pass
class B: pass
class C(A, B): pass # E: Class has multiple base classes ('A' and 'B')
[out]

0 comments on commit 5ad3861

Please sign in to comment.