Beispiel #1
0
        public void Build()
        {
            if (_result == null)
            {
                BlockParser parser = new BlockParser(_blacklistManager, _problemPipe, _returnFragment, _referenceAndOutConditions);
                Dictionary <int, BasicBlock> graph = new Dictionary <int, BasicBlock>();
                int          initialBlockId;
                List <Block> blockList = GetBlocks(_methodBody.Statements);

                using (var blocksEnumerator = blockList.GetEnumerator())
                {
                    if (!blocksEnumerator.MoveNext())
                    {
                        return;
                    }
                    var currentBlock = blocksEnumerator.Current;
// ReSharper disable PossibleNullReferenceException
                    initialBlockId = currentBlock.UniqueKey;
// ReSharper restore PossibleNullReferenceException
                    BasicBlock currentBasicBlock;
                    while (blocksEnumerator.MoveNext())
                    {
                        var nextBlock = blocksEnumerator.Current;

                        if (ContainsUnconditionalBranch(currentBlock))
                        {
                            currentBasicBlock = parser.Parse(currentBlock);
                        }
                        else
                        {
// ReSharper disable PossibleNullReferenceException
                            currentBasicBlock = parser.Parse(currentBlock, nextBlock.UniqueKey);
// ReSharper restore PossibleNullReferenceException
                        }
                        graph.Add(currentBasicBlock.Id, currentBasicBlock);

                        currentBlock = nextBlock;
                    }
                    currentBasicBlock = parser.Parse(currentBlock);
                    graph.Add(currentBasicBlock.Id, currentBasicBlock);
                }

                _result = new MethodGraph(initialBlockId, graph);
            }
        }
Beispiel #2
0
        public void Parse_ValidReturnWithIf_ReturnsCorrectReturnFragmentType()
        {
            _blockParser = new BlockParser(_blacklist, _problemPipeStub, Fragment.CreateNamed("DummyFragment"), new List <ReturnCondition>());
            TypeNode   stringTypeNode           = IntrospectionUtility.TypeNodeFactory <string>();
            Method     sampleMethod             = TestHelper.GetSample <BlockParserSample> ("ValidReturnWithLiteralAssignmentInsideIf", stringTypeNode);
            Block      sample                   = sampleMethod.Body.Statements[3] as Block;
            BasicBlock returnedBlock            = _blockParser.Parse(sample);
            var        preConditionFragmentType = returnedBlock.PreConditions[0].Fragment;

            Assert.That(preConditionFragmentType, Is.EqualTo(Fragment.CreateNamed("DummyFragment")));
        }
Beispiel #3
0
        public void Parse_ReturnFragmentRequiredUnsafeReturn_ReturnsCorrectReturnFragmentType2()
        {
            var returnFragmentType = Fragment.CreateNamed("ReturnFragmentType2");

            _blockParser = new BlockParser(_blacklist, _problemPipeStub, returnFragmentType, new List <ReturnCondition>());
            Method     sampleMethod         = TestHelper.GetSample <BlockParserSample> ("UnsafeReturnWhenFragmentRequired");
            Block      sample               = sampleMethod.Body.Statements[1] as Block;
            BasicBlock returnedBlock        = _blockParser.Parse(sample);
            var        preConditionFragment = returnedBlock.PreConditions[0].Fragment;

            Assert.That(preConditionFragment, Is.EqualTo(returnFragmentType));
        }
Beispiel #4
0
        public void Parse_NotBlock_ReturnsNull()
        {
            // Arrange
            var parser      = new Parser("foo");
            var blockParser = new BlockParser(parser);

            parser.PushScopeStack();

            // Act

            var result = blockParser.Parse();

            // Assert
            Assert.That(result, Is.Null);
            Assert.That(parser.StackCount, Is.EqualTo(0));
        }
Beispiel #5
0
        public void Parse_Method_ReturnsBlockWithMethod()
        {
            // Arrange
            var parser      = new Parser("{ main() { } }");
            var blockParser = new BlockParser(parser);

            parser.PushScopeStack();

            // Act

            var result = blockParser.Parse() as Block;

            // Assert
            Assert.That(result.Statements, Has.One.InstanceOf <Method>());
            Assert.That(parser.StackCount, Is.EqualTo(0));
        }
Beispiel #6
0
        public void Parse_Empty_ReturnsEmptyBlock()
        {
            // Arrange
            var parser      = new Parser("{ }");
            var blockParser = new BlockParser(parser);

            parser.PushScopeStack();

            // Act

            var result = blockParser.Parse();

            // Assert
            Assert.That(result, Is.InstanceOf <Block>().With.Property(nameof(Block.Statements)).Empty);
            Assert.That(parser.StackCount, Is.EqualTo(0));
        }
Beispiel #7
0
 protected virtual void Init()
 {
     RootScope = BlockParser.Parse(Method, Method.Body);
     IRContext = new IRContext(Method, Method.Body);
 }
Beispiel #8
0
        public void Parse_PostConditionOnlySafeSymbols()
        {
            Method     sampleMethod         = TestHelper.GetSample <BlockParserSample> ("PostConditionOnlySafeSymbols");
            Block      sample               = sampleMethod.Body.Statements[0] as Block;
            BasicBlock basicBlock           = _blockParser.Parse(sample);
            bool       correctPostCondition = basicBlock.PostConditionSymbolTable.IsAssignableTo("local$0", Fragment.CreateNamed("SqlFragment")) &&
                                              basicBlock.PostConditionSymbolTable.IsAssignableTo("local$1", Fragment.CreateNamed("SqlFragment"));

            Assert.That(correctPostCondition, Is.True);
        }
Beispiel #9
0
 static public void Merge(TextAsset inTextAsset, TextPackage ioTarget)
 {
     BlockParser.Parse(ref ioTarget, inTextAsset.name, inTextAsset.text, BlockParsingRules.Default, new Generator());
 }
Beispiel #10
0
 static public TextPackage Parse(TextAsset inTextAsset)
 {
     return(BlockParser.Parse(inTextAsset.name, inTextAsset.text, BlockParsingRules.Default, new Generator()));
 }