public static void UnifyWireInputTerminalTypes(this Wire wire, TerminalTypeUnificationResults typeUnificationResults) { // Merge the wire's input terminal with its connected source foreach (var wireTerminal in wire.InputTerminals) { var connectedNodeTerminal = wireTerminal.ConnectedTerminal; if (connectedNodeTerminal != null) { VariableReference wireVariable = wireTerminal.GetFacadeVariable(), nodeVariable = connectedNodeTerminal.GetFacadeVariable(); wireTerminal.UnifyTerminalTypeWith( wireVariable.TypeVariableReference, nodeVariable.TypeVariableReference, typeUnificationResults); wireVariable.MergeInto(nodeVariable); } } }
public override MocTransformManager GenerateMocTransformManager( CompileSpecification compileSpecification, DfirRoot sourceDfir, CompileCancellationToken cancellationToken) { TerminalTypeUnificationResults unificationResults = new TerminalTypeUnificationResults(); LifetimeVariableAssociation lifetimeVariableAssociation = new LifetimeVariableAssociation(); List <IDfirTransformBase> semanticAnalysisTransforms = new List <IDfirTransformBase>() { new CreateNodeFacadesTransform(), new MergeVariablesAcrossWiresTransform(lifetimeVariableAssociation, unificationResults), new FinalizeAutoBorrowsTransform(), new MarkConsumedVariablesTransform(lifetimeVariableAssociation), new ValidateVariableUsagesTransform(unificationResults), new ReflectVariablesToTerminalsTransform(), }; if (RebarFeatureToggles.IsRebarTargetEnabled) { semanticAnalysisTransforms.Add(new RebarSupportedTargetTransform(SemanticAnalysisTargetInfo)); } semanticAnalysisTransforms.Add(new StandardTypeReflectionTransform()); ReflectErrorsTransform.AddErrorReflection(semanticAnalysisTransforms, CompilePhase.SemanticAnalysis); if (!RebarFeatureToggles.IsRebarTargetEnabled) { semanticAnalysisTransforms.Add(new EmptyTargetDfirTransform()); } var nodeInsertionTypeUnificationResultFactory = new NodeInsertionTypeUnificationResultFactory(); List <IDfirTransformBase> toTargetDfirTransforms = new List <IDfirTransformBase>() { new AutoBorrowTransform(lifetimeVariableAssociation), new InsertTerminateLifetimeTransform(lifetimeVariableAssociation, nodeInsertionTypeUnificationResultFactory), new InsertDropTransform(lifetimeVariableAssociation, nodeInsertionTypeUnificationResultFactory), }; return(new StandardMocTransformManager( compileSpecification, sourceDfir, semanticAnalysisTransforms, toTargetDfirTransforms, _host.GetSharedExportedValue <ScheduledActivityManager>())); }
public abstract void UnifyWithConnectedWireTypeAsNodeInput(VariableReference wireFacadeVariable, TerminalTypeUnificationResults unificationResults);
public override void UnifyWithConnectedWireTypeAsNodeInput(VariableReference wireFacadeVariable, TerminalTypeUnificationResults unificationResults) { // we're a node output facade; this should never be called. throw new NotImplementedException(); }
public override void UnifyWithConnectedWireTypeAsNodeInput(VariableReference wireFacadeVariable, TerminalTypeUnificationResults unificationResults) { FacadeVariable.MergeInto(wireFacadeVariable); bool setExpectedMutable; TypeVariableReference typeToUnifyWith = ComputeTypeToUnifyWith(wireFacadeVariable, out setExpectedMutable); ITypeUnificationResult unificationResult = unificationResults.GetTypeUnificationResult( Terminal, TrueVariable.TypeVariableReference, typeToUnifyWith); if (setExpectedMutable) { unificationResult.SetExpectedMutable(); } TypeVariableSet.Unify(TrueVariable.TypeVariableReference, typeToUnifyWith, unificationResult); }
public ValidateVariableUsagesTransform(TerminalTypeUnificationResults typeUnificationResults) { _typeUnificationResults = typeUnificationResults; }
public MergeVariablesAcrossWiresTransform(LifetimeVariableAssociation lifetimeVariableAssociation, TerminalTypeUnificationResults typeUnificationResults) { _lifetimeVariableAssociation = lifetimeVariableAssociation; _typeUnificationResults = typeUnificationResults; }
public override void UnifyWithConnectedWireTypeAsNodeInput(VariableReference wireFacadeVariable, TerminalTypeUnificationResults unificationResults) { TrueVariable.MergeInto(wireFacadeVariable); _unificationState.UpdateFromConnectedInput(wireFacadeVariable); }
public override void UnifyWithConnectedWireTypeAsNodeInput(VariableReference wireFacadeVariable, TerminalTypeUnificationResults unificationResults) { ITypeUnificationResult unificationResult = unificationResults.GetTypeUnificationResult( Terminal, FacadeVariable.TypeVariableReference, wireFacadeVariable.TypeVariableReference); FacadeVariable.UnifyTypeVariableInto(wireFacadeVariable, unificationResult); FacadeVariable.MergeInto(wireFacadeVariable); }
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); }