|
From: <bl...@us...> - 2003-05-29 21:15:35
|
Update of /cvsroot/cpptool/rfta/src/pyrfta/test/rfta
In directory sc8-pr-cvs1:/tmp/cvs-serv17464/src/pyrfta/test/rfta
Modified Files:
codeanalysis.py codeanalysistest.py
Log Message:
* added scope handling
* added locale variable resolution
* added using declaration support in scope
Index: codeanalysis.py
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/pyrfta/test/rfta/codeanalysis.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** codeanalysis.py 29 May 2003 17:03:06 -0000 1.2
--- codeanalysis.py 29 May 2003 21:15:18 -0000 1.3
***************
*** 1,3 ****
--- 1,4 ----
import rfta
+ import string
***************
*** 17,23 ****
self.resolver.exitScope()
- def visitNullStatement( self, statement ):
- pass
-
def visitDeclarationStatement( self, statement ):
statement.declaration.accept( self )
--- 18,21 ----
***************
*** 25,43 ****
def visitDeclaratorExpression( self, expression ):
for declarator in expression.getDeclarators():
! self.resolver.declareVariable( declarator.name.identifier )
!
! class LocalVariableResolver:
! def isLocaleVariable(self, variableName):
! return false
! def declareVariable(self, variableName):
! pass
! def enterScope(self):
pass
! def exitScope(self):
! pass
--- 23,151 ----
def visitDeclaratorExpression( self, expression ):
for declarator in expression.getDeclarators():
! self.resolver.declareVariable( declarator.name.identifier, expression )
! def visitForStatement( self, statement ):
! self.resolver.enterForScope()
! statement.declaration.accept( self )
! self._visitScopedSubstatement( statement.iteratedStatement )
! self.resolver.exitForScope()
! def visitIfStatement( self, statement ):
! self._visitScopedSubstatement( statement.thenStatement )
! if statement.hasElseStatement():
! self._visitScopedSubstatement( statement.elseStatement )
! def visitNullStatement( self, statement ):
pass
! def visitWhileStatement( self, statement ):
! self._visitScopedSubstatement( statement.iteratedStatement )
!
! def _visitScopedSubstatement( self, statement ):
! self.resolver.enterScope()
! statement.accept( self )
! self.resolver.exitScope()
!
! class Identifier:
! def __init__( self, identifier ):
! self.identifier = identifier
!
! def name( self ):
! pos = string.rfind( self.identifier, '::' )
! if pos == -1:
! return self.identifier
! return self.identifier[pos:]
!
! IDTYPE_LOCALVARIABLE = 1
! IDTYPE_IMPORTEDID = 2
!
! class Scope:
! children = []
!
! def __init__( self, parent_scope ):
! self.parent_scope = parent_scope
! if self.parent_scope:
! self.parent_scope.children.append( self )
!
! def resolve( self, identifier ):
! return None
!
! def parentResolve( self, identifier ):
! if self.parent_scope:
! return self.parent_scope.resolve( self, identifier )
! return None
!
! class FunctionScope(Scope):
! def __init__( self, function ):
! Scope.__init__( self, None )
! self.function = function
!
! class LocalVariableScope(Scope):
! declared = {}
!
! def __init__( self, parent_scope ):
! Scope.__init__( self, parent_scope )
!
! def declare( self, variableName, declExpr ):
! self.declared[variableName] = declExpr
!
! def declareLocalVariable( self, variableName ):
! return variableName in self.declared
!
! def resolve( self, identifier ):
! if self.declareLocalVariable( identifier ):
! return (IDTYPE_LOCALVARIABLE, self.declared[identifier])
! return self.parentResolve( identifier )
!
! class UsingDeclScope(Scope):
! imported = {}
!
! def __init__( self, parent_scope ):
! Scope.__init__( self, parent_scope )
!
! def importIdentifier( self, identifier ):
! imported[ Identifier(identifier).name() ] = identifier
!
! def resolve( self, identifier ):
! if declareLocalVariable( self, identifier ):
! return (IDTYPE_IMPORTEDID, imported[identifier])
! return self.parentResolve( identifier )
!
! class LocalVariableResolver:
! standard_for_scope = True
! scope_depth = 0
! resolved = {}
!
! def __init__( self, function_scope ):
! self.current_scope = function_scope
!
! def resolveVariable( self, variableName, variable_name_element ):
! variableDecl = self.current_scope.resolve( variableName )
! if variableDecl:
! self.resolved[ variable_name_element ] = variableDecl
!
! def declareVariable( self, variableName, declExpr ):
! assert( self.scope_depth > 0 )
! self.current_scope.declare( variableName, declExpr )
!
! def findVariable( self, variable_name_element ):
! return self.resolved.get( variable_name_element, None )
!
! def enterScope( self ):
! self.current_scope = LocalVariableScope( self.current_scope )
! self.scope_depth += 1
!
! def exitScope( self ):
! assert( self.scope_depth > 0 )
! self.scope_depth -= 1
! self.current_scope = self.current_scope.parent_scope
!
! def enterForScope( self ):
! if self.standard_for_scope:
! self.enterScope()
!
! def exitForScope( self ):
! if self.standard_for_scope:
! self.exitScope()
Index: codeanalysistest.py
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/pyrfta/test/rfta/codeanalysistest.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** codeanalysistest.py 29 May 2003 17:03:06 -0000 1.2
--- codeanalysistest.py 29 May 2003 21:15:18 -0000 1.3
***************
*** 5,15 ****
from mock import MockFactory
! class LocaleVariableDeclaratorTest(unittest.TestCase):
"""LocaleVariableDeclarator tests"""
def setUp( self ):
! self.resolver = self.createMockInstance( LocalVariableResolver, [] )
self.declarator = LocalVariableDeclarator( self.resolver )
- self.body = rfta.CompoundStatement()
def tearDown( self ):
--- 5,79 ----
from mock import MockFactory
!
! class CodeMother:
! """code model object mother"""
!
! def makeType( self, name ):
! return rfta.Type( name )
!
! def makeFunctionName( self, name ):
! return rfta.FunctionName( name )
!
! def makeParameters( self ):
! return rfta.Parameters()
!
! def makeFunctionDecl( self, return_type, name, parameters, body = None ):
! return rfta.FunctionDeclaration( return_type, name, parameters, body )
!
! def makeQuickFunctionDecl( self, return_type, name ):
! return self.makeFunctionDecl( self.makeType( return_type ),
! self.makeFunctionName( name ),
! self.makeParameters(),
! self.makeCompound() )
!
! def makeCompound( self ):
! return rfta.CompoundStatement()
!
! def makeVariableDeclExpr( self, variables ):
! declExpr = rfta.DeclaratorExpression( rfta.TypePart( "int" ) )
! for variable in variables:
! declarator = rfta.Declarator( rfta.TypePart(),
! rfta.Identifier(variable[0]),
! rfta.TypePart(),
! rfta.AssignInitializerExpression( rfta.GenericExpression( variable[1] ) ) )
! declExpr.appendDeclarator( declarator )
! return declExpr
!
! def makeVariableDecl( self, variables ):
! return rfta.DeclarationStatement( self.makeVariableDeclExpr( variables ) )
!
! def makeVariableName( self, name ):
! return rfta.VariableName( name )
!
! def makeWhile( self, condition, substatement ):
! return rfta.WhileStatement( condition, substatement )
!
! def makeFor( self, init, condition, update, substatement ):
! return rfta.ForStatement( init, condition, update, substatement )
!
! def makeIf( self, condition, then_statment, else_statement = None ):
! return rfta.IfStatement( condition, then_statment, else_statement )
!
! def makeNullStatement( self ):
! return rfta.NullStatement()
!
! def makeNull( self ):
! return rfta.NullExpression()
!
! def makeExpr( self, value ):
! return rfta.GenericExpression( value )
!
! def makeTrue( self ):
! return self.makeExpr( "true" )
!
!
! class LocaleVariableDeclaratorTest(unittest.TestCase,CodeMother):
"""LocaleVariableDeclarator tests"""
def setUp( self ):
! self.function = self.makeQuickFunctionDecl( "void", "f" )
! self.body = self.function.body
! self.resolver = self.createMockInstance( LocalVariableResolver, [], FunctionScope( self.function ) )
self.declarator = LocalVariableDeclarator( self.resolver )
def tearDown( self ):
***************
*** 17,29 ****
self.resolver = None
! def makeVariableDecl( self, name, init ):
! declarator = rfta.Declarator( rfta.TypePart(),
! rfta.Identifier(name),
! rfta.TypePart(),
! rfta.AssignInitializerExpression( rfta.GenericExpression( init ) ) )
! declExpr = rfta.DeclaratorExpression( rfta.TypePart( "int" ) )
! declExpr.appendDeclarator( declarator )
! declStatement = rfta.DeclarationStatement( declExpr )
! return declStatement
def testConstruction( self ):
--- 81,92 ----
self.resolver = None
! def doResolve( self ):
! self.declarator.declare( self.body )
!
! def checkDeclaredVariable( self, expected_variables ):
! actual_variables = []
! for variable_decl in self.resolver.declareVariable.argsPassed:
! actual_variables.append( variable_decl[0] )
! self.assertEqual( actual_variables, expected_variables )
def testConstruction( self ):
***************
*** 32,54 ****
def testEmptyBody( self ):
self.resolver.declareVariable.setExpectNoCall()
! self.declarator.visitCompoundStatement( self.body )
self.assertEqual( self.resolver.called, [ "enterScope", "exitScope" ] )
def testDummyBody( self ):
! self.body.appendStatement( rfta.NullStatement() )
self.resolver.declareVariable.setExpectNoCall()
! self.declarator.visitCompoundStatement( self.body )
self.assertEqual( self.resolver.called, [ "enterScope", "exitScope" ] )
! def testDeclareOneVariable( self ):
! self.body.appendStatement( self.makeVariableDecl( "var1", "3" ) )
! self.declarator.visitCompoundStatement( self.body )
! self.assertEqual( self.resolver.called, [ "enterScope", "declareVariable", "exitScope" ] )
! self.assertEqual( self.resolver.declareVariable.argsPassed, [("var1",)] )
def suite():
! return unittest.makeSuite(IdentifierResolverTestCase)
if __name__ == '__main__':
--- 95,201 ----
def testEmptyBody( self ):
self.resolver.declareVariable.setExpectNoCall()
! self.declarator.declare( self.body )
self.assertEqual( self.resolver.called, [ "enterScope", "exitScope" ] )
def testDummyBody( self ):
! self.body.appendStatement( self.makeNullStatement() )
self.resolver.declareVariable.setExpectNoCall()
! self.declarator.declare( self.body )
self.assertEqual( self.resolver.called, [ "enterScope", "exitScope" ] )
! def testDeclareTwoVariables( self ):
! self.body.appendStatement( self.makeVariableDecl( [("var1", "3"), ("var2", "7")] ) )
! self.declarator.declare( self.body )
! self.assertEqual( self.resolver.called, [ "enterScope", "declareVariable", "declareVariable", "exitScope" ] )
! self.checkDeclaredVariable( ["var1", "var2" ] )
!
! def testWhileScope( self ):
! self.body.appendStatement( self.makeWhile( self.makeTrue(),
! self.makeVariableDecl( [("var1", "453")] ) ) )
! self.declarator.declare( self.body )
! self.assertEqual( self.resolver.called,
! [ "enterScope", "enterScope", "declareVariable", "exitScope", "exitScope" ] )
! self.checkDeclaredVariable( ["var1"] )
!
! def testIfThenScope( self ):
! self.body.appendStatement( self.makeIf( self.makeTrue(),
! self.makeVariableDecl( [("var1", "453")] ) ) )
! self.declarator.declare( self.body )
! self.assertEqual( self.resolver.called,
! [ "enterScope", "enterScope", "declareVariable", "exitScope", "exitScope" ] )
! self.checkDeclaredVariable( ["var1"] )
!
! def testIfThenElseScope( self ):
! self.body.appendStatement( self.makeIf( self.makeTrue(),
! self.makeVariableDecl( [("var1", "453")] ),
! self.makeVariableDecl( [("var2", "456")] ) ) )
! self.declarator.declare( self.body )
! self.assertEqual( self.resolver.called,
! [ "enterScope", "enterScope", "declareVariable", "exitScope",
! "enterScope", "declareVariable", "exitScope",
! "exitScope" ] )
! self.checkDeclaredVariable( ["var1","var2"] )
!
! def testForScope( self ):
! self.body.appendStatement( self.makeFor( self.makeVariableDeclExpr( [("var1", "453")] ),
! self.makeTrue(),
! self.makeNull(),
! self.makeVariableDecl( [("var2", "412")] ),
! ) )
! self.declarator.declare( self.body )
! self.assertEqual( self.resolver.called,
! [ "enterScope",
! "enterForScope", "enterScope", "declareVariable",
! "enterScope", "declareVariable", "exitScope",
! "exitForScope", "exitScope", "exitScope" ] )
! self.checkDeclaredVariable( ["var1","var2"] )
!
! class LocaleVariableResolverTest(unittest.TestCase,CodeMother):
! """LocaleVariableResolver tests"""
!
! def setUp( self ):
! self.function = self.makeQuickFunctionDecl( "void", "f" )
! self.resolver = LocalVariableResolver( FunctionScope( self.function ) )
! self.declExpr1 = self.makeVariableDeclExpr( [("var1", "1"), ("var2","b"), ("var3","c")] )
! self.declExpr2 = self.makeVariableDeclExpr( [("x", "1"), ("y","b"), ("z","c")] )
! self.identifiers = {}
! for name in [ "var1", "var2", "var3", "x", "y", "z" ]:
! for count in range(1,5):
! variable_name = name + "." + str(count)
! self.identifiers[ variable_name ] = self.makeVariableName( variable_name )
!
! def tearDown( self ):
! pass
!
! def declareVariables( self, names, declExpr ):
! for name in names:
! self.resolver.declareVariable( name, declExpr )
!
! def resolveVariables( self, variables ):
! for variable in variables:
! id = variable[0] + "." + str(variable[1])
! self.resolver.resolveVariable( variable[0], self.identifiers[id] )
!
! def checkVariableResolutions( self, names, declExpr ):
! for name in names:
! self.assertEqual( self.resolver.findVariable( self.identifiers[name] ),
! (IDTYPE_LOCALVARIABLE,declExpr) )
!
! def testConstruction( self ):
! self.assertEqual( self.resolver.current_scope.function, self.function )
!
! def testDeclareAndResolve( self ):
! self.resolver.enterScope()
! self.declareVariables( ["var1", "var2", "var3"], self.declExpr1 )
! self.declareVariables( ["x", "y", "z"], self.declExpr1 )
! self.resolveVariables( [ ("var1",1), ("var2",1) ] )
! self.resolver.exitScope()
!
! self.checkVariableResolutions( ["var1.1", "var2.1"], self.declExpr1 )
def suite():
! return unittest.makeSuite(IdentifierResolverTestCase, LocaleVariableResolverTest)
if __name__ == '__main__':
|