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);
         }
     }
 }
Example #2
0
        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>()));
        }
Example #3
0
 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;
 }
Example #7
0
 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);
        }
Example #10
0
        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);
        }