private void MergePostConditions(ISymbolTable adjustedContext, ISymbolTable postConditionSymbolTable) { foreach (string symbol in postConditionSymbolTable.Symbols) { adjustedContext.MakeSafe(symbol, postConditionSymbolTable.GetFragmentType(symbol)); } }
private void SetProblemMetadatasGivenFragment(ISymbolTable context) { if (_problemMetadata != null) { _problemMetadata.GivenFragment = context.GetFragmentType(_symbol); } }
public void GetResult_ParameterizedMethodSymbolTableBuiltWithEmptyEnvironment_NonFragmentFieldIsEmptyFragment() { Method sampleMethod = TestHelper.GetSample <SymbolTableBuilderSample>("ParameterizedMethod", _floatType, _objectType); EmbeddedInitialSymbolTableBuilder embeddedInitialSymbolTableBuilder = new EmbeddedInitialSymbolTableBuilder(sampleMethod, _blacklistManager, _environment); ISymbolTable resultSymbolTable = embeddedInitialSymbolTableBuilder.GetResult(); Assert.That(resultSymbolTable.GetFragmentType("_nonFragmentField"), Is.EqualTo(Fragment.CreateEmpty())); }
public void GetResult_ParameterizedMethodSymbolTableBuiltWithNonOverlappingEnvironment_FragmentParameterIsOfCorrectFragmentType() { Method sampleMethod = TestHelper.GetSample <SymbolTableBuilderSample>("ParameterizedMethod", _floatType, _objectType); EmbeddedInitialSymbolTableBuilder embeddedInitialSymbolTableBuilder = new EmbeddedInitialSymbolTableBuilder(sampleMethod, _blacklistManager, _environment); ISymbolTable resultSymbolTable = embeddedInitialSymbolTableBuilder.GetResult(); Assert.That(resultSymbolTable.GetFragmentType("fragmentParameter"), Is.EqualTo(Fragment.CreateNamed("FragmentType"))); }
private void MergeBlockAssignments(ISymbolTable context, ISymbolTable adjustedContext, BlockAssignment[] blockAssignments) { foreach (var blockAssignment in blockAssignments) { Fragment propagatedFragmentType = context.GetFragmentType(blockAssignment.SourceSymbol); adjustedContext.MakeSafe(blockAssignment.TargetSymbol, propagatedFragmentType); } }
public void GetResult_ParameterizedMethodSymbolTable_UnknownSymbolIsListedAsEmptyFragment() { Method sampleMethod = TestHelper.GetSample <SymbolTableBuilderSample>("ParameterizedMethod", _floatType, _objectType); InitialSymbolTableBuilder initialSymbolTableBuilder = new InitialSymbolTableBuilder(sampleMethod, _blacklistManager); ISymbolTable resultSymbolTable = initialSymbolTableBuilder.GetResult(); Assert.That(resultSymbolTable.GetFragmentType("unknownSymbol"), Is.EqualTo(Fragment.CreateEmpty())); }
public void GetResult_ParameterizedMethodSymbolTable_FragmentParameterIsOfCorrectFragmentType() { Method sampleMethod = TestHelper.GetSample <SymbolTableBuilderSample>("ParameterizedMethod", _floatType, _objectType); InitialSymbolTableBuilder initialSymbolTableBuilder = new InitialSymbolTableBuilder(sampleMethod, _blacklistManager); ISymbolTable resultSymbolTable = initialSymbolTableBuilder.GetResult(); Assert.That(resultSymbolTable.GetFragmentType("fragmentParameter"), Is.EqualTo(Fragment.CreateNamed("FragmentType"))); }
public void GetResult_ParameterizedMethodSymbolTableBuiltWithOverlappingEnvironment_FragmentFieldIsEmptyFragment() { Method sampleMethod = TestHelper.GetSample <SymbolTableBuilderSample>("ParameterizedMethod", _floatType, _objectType); EmbeddedInitialSymbolTableBuilder embeddedInitialSymbolTableBuilder = new EmbeddedInitialSymbolTableBuilder(sampleMethod, _blacklistManager, _environment); _environment.MakeSafe("_fragmentField", Fragment.CreateNamed("ThisShouldBeIgnored")); ISymbolTable resultSymbolTable = embeddedInitialSymbolTableBuilder.GetResult(); Assert.That(resultSymbolTable.GetFragmentType("_fragmentField"), Is.EqualTo(Fragment.CreateEmpty())); }
private void InferArrayFragment(AssignmentStatement assignmentStatement, string targetName, HandleContext context) { ISymbolTable symbolTable = context.SymbolTable; Fragment targetFragmentType = symbolTable.InferFragmentType(assignmentStatement.Source); if (context.ArrayFragmentTypeDefined[targetName] == false) { symbolTable.MakeSafe(targetName, targetFragmentType); context.ArrayFragmentTypeDefined[targetName] = true; } else if (symbolTable.GetFragmentType(targetName) == Fragment.CreateLiteral()) { symbolTable.MakeSafe(targetName, targetFragmentType); } else if (symbolTable.GetFragmentType(targetName) != targetFragmentType && targetFragmentType != Fragment.CreateLiteral()) { symbolTable.MakeUnsafe(targetName); } }
public void GetResult_ParameterizedMethodSymbolTableBuiltWithOverlappingNonFragmentField_EnvironmentSymbolIsPropagated() { Method sampleMethod = TestHelper.GetSample <SymbolTableBuilderSample>("ParameterizedMethod", _floatType, _objectType); EmbeddedInitialSymbolTableBuilder embeddedInitialSymbolTableBuilder = new EmbeddedInitialSymbolTableBuilder(sampleMethod, _blacklistManager, _environment); _environment.MakeSafe("_nonFragmentField", Fragment.CreateNamed("OverlappingType")); ISymbolTable resultSymbolTable = embeddedInitialSymbolTableBuilder.GetResult(); Assert.That(resultSymbolTable.GetFragmentType("_nonFragmentField"), Is.EqualTo(Fragment.CreateNamed("OverlappingType"))); }
private void CheckAssignment(AssignmentStatement assignmentStatement, string targetName, HandleContext context) { ISymbolTable symbolTable = context.SymbolTable; Fragment targetFragmentType = symbolTable.GetFragmentType(targetName); Fragment sourceFragmentType = symbolTable.InferFragmentType(assignmentStatement.Source); if (targetFragmentType != sourceFragmentType) { symbolTable.MakeUnsafe(targetName); } else { SetPreConditionForIndexerObject(assignmentStatement, targetName, sourceFragmentType, context); } }
public override void HandleViolation(ISymbolTable context, IProblemPipe problemPipe) { if (!IsViolated (context)) return; bool symbolIsUndefined = context.Contains (_symbol) && context.GetFragmentType (_symbol).Undefined; if (symbolIsUndefined) { SetSymbolFragmentType(context); } else { HandleFragmentConflict (context, problemPipe); } }
public Fragment InferFragmentType(MethodCall methodCall, ISymbolTable context) { Fragment returnFragment = Fragment.CreateEmpty(); Method method = IntrospectionUtility.ExtractMethod(methodCall); if (Infers(method) && methodCall.Callee is MemberBinding) { MemberBinding memberBinding = (MemberBinding)methodCall.Callee; string variableName; if (IntrospectionUtility.IsVariable(memberBinding.TargetObject, out variableName)) { returnFragment = context.GetFragmentType(variableName); } } return(returnFragment); }
public override void HandleViolation(ISymbolTable context, IProblemPipe problemPipe) { if (!IsViolated(context)) { return; } bool symbolIsUndefined = context.Contains(_symbol) && context.GetFragmentType(_symbol).Undefined; if (symbolIsUndefined) { SetSymbolFragmentType(context); } else { HandleFragmentConflict(context, problemPipe); } }
public void Analyze(MethodCall methodCall, ISymbolTable context, List <IPreCondition> preConditions) { Method method = IntrospectionUtility.ExtractMethod(methodCall); if (Analyzes(method) && methodCall.Callee is MemberBinding) { MemberBinding memberBinding = (MemberBinding)methodCall.Callee; if (IsFragmentParameterInferenceMethod(method)) { string variableName; if (IntrospectionUtility.IsVariable(memberBinding.TargetObject, out variableName)) { Fragment parameterFragment = ParameterFragmentUtility.ParameterFragmentIntersection(methodCall, context); Fragment targetObjectFragment = context.GetFragmentType(variableName); if (targetObjectFragment == Fragment.CreateLiteral() || targetObjectFragment.Undefined) { context.MakeSafe(variableName, parameterFragment); } else { if (targetObjectFragment == Fragment.CreateEmpty() && parameterFragment != Fragment.CreateLiteral()) // && parameterFragment != Fragment.CreateEmpty() { ProblemMetadata problemMetadata = new ProblemMetadata(methodCall.UniqueKey, methodCall.SourceContext, parameterFragment, targetObjectFragment); IPreCondition precondition = new CustomInferencePreCondition(variableName, parameterFragment, problemMetadata); preConditions.Add(precondition); } else if (!FragmentUtility.FragmentTypesAssignable(parameterFragment, targetObjectFragment)) { context.MakeUnsafe(variableName); } } } } else if (!IsSafeMethod(method)) { string variableName; if (IntrospectionUtility.IsVariable(memberBinding.TargetObject, out variableName)) { context.MakeUnsafe(variableName); } } } }
public void HandleStatement_InitializationWithEmptyConstructor_VariableFragmentTypeIsNull() { Method sampleMethod = IntrospectionUtility.MethodFactory <StringBuilderConstructStatementHandlerSample> ("InitializationWithEmptyConstructor"); Block sampleBlock = (Block)sampleMethod.Body.Statements[0]; Statement sample = sampleBlock.Statements[1]; HandleContext context = new HandleContext( sample, _symbolTable, new List <IPreCondition>(), new List <string>(), new List <BlockAssignment>(), new List <int>(), new Dictionary <string, bool>(), _stringBuilderFragmentTypesDefined); _handler.Handle(context); bool variableUndefined = _symbolTable.GetFragmentType("local$0").Undefined; Assert.That(variableUndefined, Is.True); }
protected override bool ViolationCheckStrategy(ISymbolTable context) { return context.GetFragmentType (_symbol) != _fragment; }
protected override bool ViolationCheckStrategy(ISymbolTable context) { return(context.GetFragmentType(_symbol) != _fragment); }
protected override bool ViolationCheckStrategy(ISymbolTable context) { Fragment givenFragment = context.GetFragmentType (_symbol); return !FragmentUtility.FragmentTypesAssignable (givenFragment, _fragment); }
private void MergeBlockAssignments(ISymbolTable context, ISymbolTable adjustedContext, BlockAssignment[] blockAssignments) { foreach (var blockAssignment in blockAssignments) { Fragment propagatedFragmentType = context.GetFragmentType (blockAssignment.SourceSymbol); adjustedContext.MakeSafe (blockAssignment.TargetSymbol, propagatedFragmentType); } }
private void MergePostConditions(ISymbolTable adjustedContext, ISymbolTable postConditionSymbolTable) { foreach (string symbol in postConditionSymbolTable.Symbols) { adjustedContext.MakeSafe (symbol, postConditionSymbolTable.GetFragmentType (symbol)); } }
public Fragment InferFragmentType(MethodCall methodCall, ISymbolTable context) { Fragment returnFragment = Fragment.CreateEmpty(); Method method = IntrospectionUtility.ExtractMethod (methodCall); if (Infers (method) && methodCall.Callee is MemberBinding) { MemberBinding memberBinding = (MemberBinding) methodCall.Callee; string variableName; if (IntrospectionUtility.IsVariable (memberBinding.TargetObject, out variableName)) { returnFragment = context.GetFragmentType (variableName); } } return returnFragment; }
public void Analyze(MethodCall methodCall, ISymbolTable context, List<IPreCondition> preConditions) { Method method = IntrospectionUtility.ExtractMethod (methodCall); if (Analyzes(method) && methodCall.Callee is MemberBinding) { MemberBinding memberBinding = (MemberBinding) methodCall.Callee; if (IsFragmentParameterInferenceMethod (method)) { string variableName; if (IntrospectionUtility.IsVariable (memberBinding.TargetObject, out variableName)) { Fragment parameterFragment = ParameterFragmentUtility.ParameterFragmentIntersection (methodCall, context); Fragment targetObjectFragment = context.GetFragmentType (variableName); if (targetObjectFragment == Fragment.CreateLiteral() || targetObjectFragment.Undefined) { context.MakeSafe (variableName, parameterFragment); } else { if (targetObjectFragment == Fragment.CreateEmpty() && parameterFragment != Fragment.CreateLiteral()) // && parameterFragment != Fragment.CreateEmpty() { ProblemMetadata problemMetadata = new ProblemMetadata(methodCall.UniqueKey, methodCall.SourceContext, parameterFragment, targetObjectFragment); IPreCondition precondition = new CustomInferencePreCondition(variableName, parameterFragment, problemMetadata); preConditions.Add(precondition); } else if (!FragmentUtility.FragmentTypesAssignable(parameterFragment, targetObjectFragment)) { context.MakeUnsafe(variableName); } } } } else if (!IsSafeMethod(method)) { string variableName; if (IntrospectionUtility.IsVariable(memberBinding.TargetObject, out variableName)) { context.MakeUnsafe(variableName); } } } }
protected override bool ViolationCheckStrategy(ISymbolTable context) { Fragment givenFragment = context.GetFragmentType(_symbol); return(!FragmentUtility.FragmentTypesAssignable(givenFragment, _fragment)); }
private void SetProblemMetadatasGivenFragment(ISymbolTable context) { if(_problemMetadata != null) _problemMetadata.GivenFragment = context.GetFragmentType (_symbol); }