def test_can_write_js_with_extends_and_constructor(self): EXPECTED = "var Dog=function(name,age){var self=this;var $super=new Animal(name,age);$.extend(true,self,$super);var $ctor=function(name,age){};$ctor(name,age);};" cls = Class("Dog",extends="Animal") cls.constructor_params.append("name") cls.constructor_params.append("age") cls.super_params.append("name") cls.super_params.append("age") assert_that(cls.to_js(),is_(EXPECTED))
def enter_field(self, cls: Class, ctx: PlayParser.FieldDeclarationContext): if cls.is_interface or cls.is_native: raise CompileException( "Interface/native class {} cannot have fields".format(cls)) field = Field(ctx.variable().IDENTIFIER().getText(), cls, build_type(ctx.variable().typeName(), cls)) Option().nodes[field] = ctx cls.put_field(field)
def p_class_statement(p): privacy, name = p[1], p[3] extension = None if p[4] is not None: extension = p[4] newclass = Class(name,extends=extension) newclass.visibility = privacy p[0] = newclass
def enter_class(self, package: Package, src: SourceFile, ctx: PlayParser.ClassDeclarationContext): cls = Class(ctx.IDENTIFIER().getText(), package, src) cls.is_interface = ctx.INTERFACE() is not None cls.is_native = ctx.NATIVE() is not None if cls.is_native and cls.is_interface: raise CompileException('interface {} cannot be native'.format(cls)) Option().nodes[cls] = ctx package.put(cls) SymbolTable().enter_class(cls)
def enter_method(self, cls: Class, ctx: PlayParser.MethodDeclarationContext): name = ctx.IDENTIFIER().getText() if name == cls.name: name = '<init>' method = Method(name, cls) method.is_native = ctx.NATIVE() is not None method.is_static = ctx.STATIC() is not None method.is_abstract = not method.is_native and ctx.block() is None if method.is_native and ctx.block() is not None: raise CompileException( 'Native method {} in class {} cannot have body'.format( method.name, method.owner)) if ctx.parameters(): for v in ctx.parameters().variable(): parameter_type = build_type(v.typeName(), cls) method.parameters.append( Parameter(v.IDENTIFIER().getText(), parameter_type)) if ctx.typeName(): method.return_type = build_type(ctx.typeName(), cls) Option().nodes[method] = ctx cls.put_method(method)
def build(self, cls: Class): ctx: PlayParser.ClassDeclarationContext = Option().nodes[cls] if ctx.classTypeList(): for sc in ctx.classTypeList().classType(): superclass = lookup_class(sc.IDENTIFIER().getText(), cls) if superclass.is_native: raise CompileException( 'Cannot inherit from native class {}'.format( superclass)) if superclass.is_interface: cls.interfaces.append(superclass) elif cls.superclass: raise CompileException( "Class {} has more than one superclass".format(cls)) elif superclass.is_native and superclass.qualified_name != 'play.Object': raise CompileException( "Cannot inherit native class {}".format(cls)) else: cls.superclass = superclass obj_cls = PLAY_PACKAGE.children['Object'] if cls != obj_cls and not cls.is_interface and not cls.superclass: cls.superclass = obj_cls
class TestClass(TestCase): def setUp(self): self.cls = Class("Animal") def test_cannot_rename_name(self): try: self.cls.name = "Dog" self.fail("Shouldn't be able to rename.") except AttributeError: pass def test_can_write_js(self): EXPECTED = "var Animal=function(){var self=this;var $ctor=function(){};$ctor();};" assert_that(self.cls.to_js(),is_(EXPECTED)) def test_can_write_js_with_extends_and_constructor(self): EXPECTED = "var Dog=function(name,age){var self=this;var $super=new Animal(name,age);$.extend(true,self,$super);var $ctor=function(name,age){};$ctor(name,age);};" cls = Class("Dog",extends="Animal") cls.constructor_params.append("name") cls.constructor_params.append("age") cls.super_params.append("name") cls.super_params.append("age") assert_that(cls.to_js(),is_(EXPECTED)) def test_can_write_everything(self): EXPECTED = "".join(('', 'var Dog=function(name,age,breed)', '{', 'var self=this;', 'var $super=new Animal(name,age);', '$.extend(true,self,$super);', 'var $ctor=function(name,age,breed)', '{this.breed=breed;};', '', 'var priv="private";', 'var priv2=function()', '{return "this is a private function";};', '', 'var privNone=null;', 'self.makeNoise=function()', '{alert("Bark!");};', '', 'self.pub="public";', 'self.pubNone=null;', '$ctor(name,age,breed);' ,'};', 'Dog.statNone=null;', 'Dog.static1="Hello";' )) cls = Class("Dog",extends="Animal") cls.constructor_params.append("name") cls.constructor_params.append("age") cls.constructor_params.append("breed") cls.constructor_body="this.breed=breed;" cls.super_params.append("name") cls.super_params.append("age") priv = "\"private\"" priv2 = """function(){return "this is a private function";}""" pub = '"public"' makeNoise = """function(){alert("Bark!");}""" cls.private["priv"]=priv cls.private["priv2"]=priv2 cls.private["privNone"]=None cls.public["pub"]=pub cls.public["pubNone"]=None cls.public["makeNoise"]=makeNoise cls.static["static1"]='"Hello"' cls.static["statNone"]=None assert_that(cls.to_js(),is_(EXPECTED))
def test_can_write_everything(self): EXPECTED = "".join(('', 'var Dog=function(name,age,breed)', '{', 'var self=this;', 'var $super=new Animal(name,age);', '$.extend(true,self,$super);', 'var $ctor=function(name,age,breed)', '{this.breed=breed;};', '', 'var priv="private";', 'var priv2=function()', '{return "this is a private function";};', '', 'var privNone=null;', 'self.makeNoise=function()', '{alert("Bark!");};', '', 'self.pub="public";', 'self.pubNone=null;', '$ctor(name,age,breed);' ,'};', 'Dog.statNone=null;', 'Dog.static1="Hello";' )) cls = Class("Dog",extends="Animal") cls.constructor_params.append("name") cls.constructor_params.append("age") cls.constructor_params.append("breed") cls.constructor_body="this.breed=breed;" cls.super_params.append("name") cls.super_params.append("age") priv = "\"private\"" priv2 = """function(){return "this is a private function";}""" pub = '"public"' makeNoise = """function(){alert("Bark!");}""" cls.private["priv"]=priv cls.private["priv2"]=priv2 cls.private["privNone"]=None cls.public["pub"]=pub cls.public["pubNone"]=None cls.public["makeNoise"]=makeNoise cls.static["static1"]='"Hello"' cls.static["statNone"]=None assert_that(cls.to_js(),is_(EXPECTED))
def setUp(self): self.cls = Class("Animal")
def handleClass(p): return Class(p[1], p[3], p[4])