コード例 #1
0
ファイル: If.py プロジェクト: sformanjawbone/pysonarsq
    def resolve(self, s):
        from pysonarsq.java.Analyzer import Analyzer

        type1 = None
        type2 = None
        self.resolveExpr(self.test, s)
        s1 = s.copy()
        s2 = s.copy()
        
        if self.body is not None and not self.body.isEmpty():
            type1 = self.resolveExpr(self.body, s1)
        else:
            type1 = Analyzer.self.builtins.Cont
            
        if self.orelse is not None and not self.orelse.isEmpty():
            type2 = self.resolveExpr(self.orelse, s2)
        else:
            type2 = Analyzer.self.builtins.Cont
            
        cont1 = UnionType.contains(type1, Analyzer.self.builtins.Cont)
        cont2 = UnionType.contains(type2, Analyzer.self.builtins.Cont)
        
        if cont1 and cont2:
            s.overwrite(Scope.merge(s1, s2))
        elif cont1:
            s.overwrite(s1)
        elif cont2:
            s.overwrite(s2)
            
        return UnionType.union(type1, type2)
コード例 #2
0
    def resolve(self, scope):

        from pysonarsq.java.Analyzer import Analyzer
        from pysonarsq.java.Scope import Scope

        #  find global names and mark them
        for n in self.seq:
            if n.isGlobal():
                for name in n.asGlobal().getNames():
                    scope.addGlobalName(name.id)
                    nb = scope.lookup(name.id)
                    if nb is not None:
                        Analyzer.self.putRef(name, nb)

        returned = False
        retType = Analyzer.self.builtins.unknown

        for n in self.seq:
            t = self.resolveExpr(n, scope)

            if not returned:
                retType = UnionType.union(retType, t)
                if not UnionType.contains(t, Analyzer.self.builtins.Cont):
                    returned = True
                    retType = UnionType.remove(retType,
                                               Analyzer.self.builtins.Cont)
            elif scope.getScopeType(
            ) != Scope.ScopeType.GLOBAL and scope.getScopeType(
            ) != Scope.ScopeType.MODULE:
                Analyzer.self.putProblem(n, "unreachable code")

        return retType
コード例 #3
0
ファイル: Block.py プロジェクト: ariejdl/pysonarsq
    def resolve(self, scope):
        
        from pysonarsq.java.Analyzer import Analyzer   
        from pysonarsq.java.Scope import Scope     

        #  find global names and mark them
        for n in self.seq:
            if n.isGlobal():
                for name in n.asGlobal().getNames():
                    scope.addGlobalName(name.id)
                    nb = scope.lookup(name.id);
                    if nb is not None:
                        Analyzer.self.putRef(name, nb)
                        
        returned = False
        retType = Analyzer.self.builtins.unknown
        
        for n in self.seq:
            t = self.resolveExpr(n, scope);
            
            if not returned:
                retType = UnionType.union(retType, t)
                if not UnionType.contains(t, Analyzer.self.builtins.Cont):
                    returned = True
                    retType = UnionType.remove(retType, Analyzer.self.builtins.Cont)
            elif scope.getScopeType() != Scope.ScopeType.GLOBAL and scope.getScopeType() != Scope.ScopeType.MODULE:
                Analyzer.self.putProblem(n, "unreachable code")
        
        return retType