コード例 #1
0
    def newInstanceContext(self, context: Context):
        from prompto.type.CategoryType import CategoryType
        from prompto.expression.CategorySymbol import CategorySymbol
        from prompto.value.ConcreteInstance import ConcreteInstance
        from prompto.value.NativeInstance import NativeInstance
        from prompto.declaration.SingletonCategoryDeclaration import SingletonCategoryDeclaration

        value = self.parent.interpret(context)
        if value is None or value is NullValue.instance:
            from prompto.error.NullReferenceError import NullReferenceError
            raise NullReferenceError()
        if isinstance(value, TypeValue):
            typ = value.value
            if isinstance(typ, CategoryType):
                decl = typ.getDeclaration(context)
                if isinstance(decl, SingletonCategoryDeclaration):
                    value = context.loadSingleton(value.value)
        if isinstance(value, CategorySymbol):
            value = value.interpret(context)
        if isinstance(value, TypeValue):
            return context.newChildContext()
        elif isinstance(value, (ConcreteInstance, NativeInstance)):
            context = context.newInstanceContext(value, None)
            return context.newChildContext()
        else:
            context = context.newBuiltInContext(value)
            return context.newChildContext()
コード例 #2
0
 def newLocalInstanceContext(self, context: Context,
                             declaration: IMethodDeclaration):
     instance = context.getClosestInstanceContext()
     if instance is not None:
         required = declaration.memberOf.getType(context)
         actual = instance.instanceType
         if not required.isAssignableFrom(context, actual):
             instance = None
     if instance is None:
         declaring = declaration.memberOf.getType(context)
         instance = context.newInstanceContext(declaring, False)
     return instance.newChildContext()
コード例 #3
0
 def newInstanceCheckContext(self, context: Context):
     from prompto.type.CategoryType import CategoryType
     from prompto.type.TypeType import TypeType
     from prompto.declaration.IDeclaration import IDeclaration
     from prompto.declaration.SingletonCategoryDeclaration import SingletonCategoryDeclaration
     typ = self.parent.check(context)
     # if calling singleton method, parent is the singleton type
     if isinstance(typ, TypeType):
         decl = context.getRegisteredDeclaration(IDeclaration,
                                                 typ.typ.typeName)
         if isinstance(decl, SingletonCategoryDeclaration):
             typ = decl.getType(context)
     if isinstance(typ, CategoryType):
         context = context.newInstanceContext(None, typ)
         return context.newChildContext()
     else:
         return context.newChildContext()