internal void RunSemanticAnalysisUpToValidation(
            DfirRoot dfirRoot,
            CompileCancellationToken cancellationToken = null,
            LifetimeVariableAssociation lifetimeVariableAssociation = null)
        {
            cancellationToken = cancellationToken ?? new CompileCancellationToken();
            var unificationResults = new TerminalTypeUnificationResults();

            RunSemanticAnalysisUpToSetVariableTypes(dfirRoot, cancellationToken, unificationResults, lifetimeVariableAssociation);
            new ValidateVariableUsagesTransform(unificationResults).Execute(dfirRoot, cancellationToken);
        }
 internal void RunSemanticAnalysisUpToSetVariableTypes(
     DfirRoot dfirRoot,
     CompileCancellationToken cancellationToken              = null,
     TerminalTypeUnificationResults unificationResults       = null,
     LifetimeVariableAssociation lifetimeVariableAssociation = null)
 {
     cancellationToken           = cancellationToken ?? new CompileCancellationToken();
     unificationResults          = unificationResults ?? new TerminalTypeUnificationResults();
     lifetimeVariableAssociation = lifetimeVariableAssociation ?? new LifetimeVariableAssociation();
     RunSemanticAnalysisUpToCreateNodeFacades(dfirRoot, cancellationToken);
     new MergeVariablesAcrossWiresTransform(lifetimeVariableAssociation, unificationResults).Execute(dfirRoot, cancellationToken);
     new FinalizeAutoBorrowsTransform().Execute(dfirRoot, cancellationToken);
     new MarkConsumedVariablesTransform(lifetimeVariableAssociation).Execute(dfirRoot, cancellationToken);
 }