def parse_decorators(self, node, funcname, current_class = None,
                          is_method = False, bind_type = None):
        if node.decorators is None:
            return False, False, '%s'
        self.push_lookup()
        self.add_lookup('variable', '%s', '%s')
        code = '%s'
        staticmethod = False
        classmethod = False
        lineno=node.lineno

        if is_method:
            bind_type = bind_type or "bound"

        def add_callfunc(code, d, generic=True):
            tnode = self.ast.CallFunc(d, [self.ast.Name('%s')],
                                      star_args=None,
                                      dstar_args=None,
                                      lineno=lineno)
            code = code % self._callfunc_code(tnode, None)

            if is_method and (bind_type == "bound") and generic:
                try:
                    bind_type_num = BIND_TYPES_NUMERIC[bind_type]
                except __HOLE__:
                    raise TranslationError("Unknown bind type: %s" % bind_type, node)
                code = "$pyjs__decorated_method('%(method_name)s', %(code)s, %(bind_type)s)" % \
                        {
                          "method_name": node.name,
                          "code": code,
                          "bind_type": bind_type_num
                        }

            return code

        for d in node.decorators:
            if isinstance(d, self.ast.Getattr):
                if isinstance(d.expr, self.ast.Name):
                    if d.expr.name == 'compiler':
                        raise TranslationError(
                            "The @compiler decorator is deprecated. Use from __pyjamas__ import setCompilerOptions", node, self.module_name)
                    if d.attrname in ("setter", "getter", "deleter"):
                        code = add_callfunc(code, d, generic=False)
                    else:
                        code = add_callfunc(code, d)
                else:
                    code = add_callfunc(code, d)
            elif isinstance(d, self.ast.Name):
                if d.name == 'staticmethod':
                    staticmethod = True
                elif d.name == 'classmethod':
                    classmethod = True
                elif d.name == 'property':
                    code = add_callfunc(code, d, generic=False)
                else:
                    code = add_callfunc(code, d)
            else:
                raise TranslationError(
                    "Unsupported decorator '%s'" % d, node, self.module_name)

        self.pop_lookup()
        if code != '%s':
            code = code % "@{{staticmethod}}(%s)"
            if staticmethod:
                code = "@{{staticmethod}}(%s)" % code
        return (staticmethod, classmethod, code)

    # Join an list into a variable with optional attributes
dataset/ETHPy150Open anandology/pyjamas/pyjs/src/pyjs/translator_proto.py/Translator.parse_decorators