示例#1
0
 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))
示例#2
0
 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)
示例#3
0
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
示例#4
0
 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)
示例#5
0
 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)
示例#6
0
 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
示例#7
0
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))
示例#8
0
 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))
示例#9
0
 def setUp(self):
     self.cls = Class("Animal")
示例#10
0
 def handleClass(p):
     return Class(p[1], p[3], p[4])