public override void UnifyWithConnectedWireTypeAsNodeInput(VariableReference wireFacadeVariable, TerminalTypeUnificationResults unificationResults) { TypeVariableSet typeVariableSet = Terminal.GetTypeVariableSet(); ITypeUnificationResult inputUnificationResult = unificationResults.GetTypeUnificationResult(Terminal, TrueVariable.TypeVariableReference, wireFacadeVariable.TypeVariableReference); typeVariableSet.Unify(TrueVariable.TypeVariableReference, wireFacadeVariable.TypeVariableReference, inputUnificationResult); TrueVariable.MergeInto(wireFacadeVariable); string constructorName; TypeVariableReference innerType, optionType; if (typeVariableSet.TryDecomposeConstructorType(TrueVariable.TypeVariableReference, out constructorName, out innerType) && constructorName == "Option") { optionType = TrueVariable.TypeVariableReference; } else { optionType = typeVariableSet.CreateReferenceToConstructorType("Option", TrueVariable.TypeVariableReference); } TypeVariableReference outputTypeReference = _outputTerminalFacade.TrueVariable.TypeVariableReference; ITypeUnificationResult outputUnificationResult = unificationResults.GetTypeUnificationResult(_outputTerminalFacade.Terminal, outputTypeReference, optionType); typeVariableSet.Unify(outputTypeReference, optionType, outputUnificationResult); }
public void TwoTypeVariables_Unify_BothBecomeSingleTypeVariable() { TypeVariableSet typeVariableSet = new TypeVariableSet(); TypeVariableReference literalReference = typeVariableSet.CreateTypeVariableReferenceFromNIType(NITypes.Int32); TypeVariableReference typeVariable1 = typeVariableSet.CreateReferenceToNewTypeVariable(), typeVariable2 = typeVariableSet.CreateReferenceToNewTypeVariable(); typeVariableSet.Unify(typeVariable2, typeVariable1, new TestTypeUnificationResult()); typeVariableSet.Unify(typeVariable1, literalReference, new TestTypeUnificationResult()); Assert.IsTrue(typeVariable1.RenderNIType().IsInt32()); Assert.IsTrue(typeVariable2.RenderNIType().IsInt32()); }
public void LiteralTypeAndConstructorType_Unify_TypeMismatchReported() { TypeVariableSet typeVariableSet = new TypeVariableSet(); TypeVariableReference literalReference = typeVariableSet.CreateTypeVariableReferenceFromNIType(NITypes.Int32), constructorReference = typeVariableSet.CreateTypeVariableReferenceFromNIType(NITypes.Int32.CreateVector()); var testTypeUnificationResult = new TestTypeUnificationResult(); typeVariableSet.Unify(constructorReference, literalReference, testTypeUnificationResult); Assert.IsTrue(testTypeUnificationResult.TypeMismatch); }
public void TwoDifferentLiteralTypes_Unify_TypeMismatchReported() { TypeVariableSet typeVariableSet = new TypeVariableSet(); TypeVariableReference literalReference1 = typeVariableSet.CreateTypeVariableReferenceFromNIType(NITypes.Int32), literalReference2 = typeVariableSet.CreateTypeVariableReferenceFromNIType(NITypes.Boolean); var testTypeUnificationResult = new TestTypeUnificationResult(); typeVariableSet.Unify(literalReference2, literalReference1, testTypeUnificationResult); Assert.IsTrue(testTypeUnificationResult.TypeMismatch); }
public void LiteralTypeAndTypeVariable_Unify_BothBecomeLiteralType() { TypeVariableSet typeVariableSet = new TypeVariableSet(); TypeVariableReference literalReference = typeVariableSet.CreateTypeVariableReferenceFromNIType(NITypes.Int32); TypeVariableReference typeVariable = typeVariableSet.CreateReferenceToNewTypeVariable(); typeVariableSet.Unify(typeVariable, literalReference, new TestTypeUnificationResult()); Assert.IsTrue(literalReference.RenderNIType().IsInt32()); Assert.IsTrue(typeVariable.RenderNIType().IsInt32()); }
public void TwoConstructorTypesWithSameConstructorName_Unify_InnerTypesAreUnified() { TypeVariableSet typeVariableSet = new TypeVariableSet(); TypeVariableReference innerTypeVariable = typeVariableSet.CreateReferenceToNewTypeVariable(); TypeVariableReference constructorType1 = typeVariableSet.CreateReferenceToOptionType(innerTypeVariable); TypeVariableReference constructorType2 = typeVariableSet.CreateReferenceToOptionType( typeVariableSet.CreateTypeVariableReferenceFromNIType(NITypes.Int32)); typeVariableSet.Unify(constructorType1, constructorType2, new TestTypeUnificationResult()); Assert.IsTrue(innerTypeVariable.RenderNIType().IsInt32()); }
public void TwoConstructorTypesWithDifferentConstructorNames_Unify_TypeMismatchReported() { TypeVariableSet typeVariableSet = new TypeVariableSet(); TypeVariableReference constructorType1 = typeVariableSet.CreateReferenceToOptionType( typeVariableSet.CreateTypeVariableReferenceFromNIType(NITypes.Int32)); TypeVariableReference constructorType2 = typeVariableSet.CreateReferenceToLockingCellType( typeVariableSet.CreateTypeVariableReferenceFromNIType(NITypes.Int32)); var typeUnificationResult = new TestTypeUnificationResult(); typeVariableSet.Unify(constructorType1, constructorType2, typeUnificationResult); Assert.IsTrue(typeUnificationResult.TypeMismatch); }
public void TwoConstructorTypesWithSameConstructorNameAndDifferentInnerTypes_Unify_TypeMismatchReported() { TypeVariableSet typeVariableSet = new TypeVariableSet(); TypeVariableReference constructorType1 = typeVariableSet.CreateReferenceToConstructorType("Vector", typeVariableSet.CreateReferenceToLiteralType(PFTypes.Int32)); TypeVariableReference constructorType2 = typeVariableSet.CreateReferenceToConstructorType("Vector", typeVariableSet.CreateReferenceToLiteralType(PFTypes.Boolean)); var typeUnificationResult = new TestTypeUnificationResult(); typeVariableSet.Unify(constructorType1, constructorType2, typeUnificationResult); Assert.IsTrue(typeUnificationResult.TypeMismatch); }
public void TypeVariableWithCopyConstraintAndNonCopyableType_Unify_FailedConstraintReported() { TypeVariableSet typeVariableSet = new TypeVariableSet(); TypeVariableReference literalReference = typeVariableSet.CreateReferenceToReferenceType( true, typeVariableSet.CreateTypeVariableReferenceFromNIType(NITypes.Int32), typeVariableSet.CreateReferenceToLifetimeType(Lifetime.Static)); var constraint = new SimpleTraitConstraint("Copy"); TypeVariableReference typeVariable = typeVariableSet.CreateReferenceToNewTypeVariable(constraint.ToEnumerable()); var testTypeUnificationResult = new TestTypeUnificationResult(); typeVariableSet.Unify(typeVariable, literalReference, testTypeUnificationResult); Assert.IsTrue(testTypeUnificationResult.FailedConstraints.Contains(constraint)); }