From 84e1c65bcd7fb857dc3b2638f7ae9bb5f1eec7b1 Mon Sep 17 00:00:00 2001 From: Simon Gomizelj Date: Wed, 14 Mar 2018 22:21:14 -0400 Subject: [PATCH] Improve checks inside `defclass` We need to make sure we're looking at HyExpression when trying to determine if we're rewriting an __init__ expression. Fixes #1533 --- hy/compiler.py | 5 ++++- tests/compilers/test_ast.py | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/hy/compiler.py b/hy/compiler.py index debf422..9758d50 100755 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -2036,7 +2036,10 @@ class HyASTCompiler(object): def compile_class_expression(self, expressions): def rewire_init(expr): new_args = [] - if expr[0] == HySymbol("setv"): + if (isinstance(expr, HyExpression) + and len(expr) > 1 + and isinstance(expr[0], HySymbol) + and expr[0] == HySymbol("setv")): pairs = expr[1:] while len(pairs) > 0: k, v = (pairs.pop(0), pairs.pop(0)) diff --git a/tests/compilers/test_ast.py b/tests/compilers/test_ast.py index 2aea3a9..c779fbd 100644 --- a/tests/compilers/test_ast.py +++ b/tests/compilers/test_ast.py @@ -212,6 +212,9 @@ def test_ast_good_defclass(): "Make sure AST can compile valid defclass" can_compile("(defclass a)") can_compile("(defclass a [])") + can_compile("(defclass a [] None 42)") + can_compile("(defclass a [] None \"test\")") + can_compile("(defclass a [] None (print \"foo\"))") @pytest.mark.skipif(not PY3, reason="Python 3 supports class keywords")