/// <summary> /// See interface docs. /// </summary> /// <param name="pathFromRoot"></param> /// <param name="redirectionContext"></param> public void RemoveRedirection(string pathFromRoot, RedirectionContext redirectionContext) { if (String.IsNullOrEmpty(pathFromRoot)) { throw new ArgumentException(nameof(pathFromRoot)); } lock (_SyncLock) { List <Redirection> liveRedirectList; var redirections = CollectionHelper.ShallowCopy(_Redirections); if (redirections.TryGetValue(pathFromRoot, out liveRedirectList)) { var redirectList = CollectionHelper.ShallowCopy(liveRedirectList); redirections[pathFromRoot] = redirectList; var existingIndex = redirectList.FindIndex(r => r.RedirectionContext == redirectionContext); if (existingIndex > -1) { redirectList.RemoveAt(existingIndex); if (redirectList.Count == 0) { redirections.Remove(pathFromRoot); } } } _Redirections = redirections; } }
/// <summary> /// Injects the custom <see cref="CSharpCompilation"/> to the emitting process, /// and resumes it. /// </summary> /// <seealso href="http://source.roslyn.io/#Microsoft.CodeAnalysis/Compilation/Compilation.cs,42341c66e909e676"/> private static void CheckOptionsAndCreateModuleBuilder(RedirectionContext context) { // Sender is a CSharpCompilation CSharpCompilation compilation = (CSharpCompilation)context.Sender; CSharpCompilation clone = compilation.Clone(); // First argument is a DiagnosticBag object diagnosticBag = context.Arguments[0]; Action <Diagnostic> addDiagnostic = Helpers.MakeAddDiagnostic(diagnosticBag); Func <IEnumerable <Diagnostic> > getDiagnostics = Helpers.MakeGetDiagnostics(diagnosticBag); object GetOriginal(CSharpCompilation newCompilation) { object[] args = new object[context.Arguments.Count]; context.Arguments.CopyTo(args, 0); newCompilation.CopyTo(compilation); return(context.Invoke(args)); } // CancellationToken should be last argument, but whatever. CancellationToken cancellationToken = context.Arguments.OfType <CancellationToken>().FirstOrDefault(); // Edit the compilation (if a matching CometaryManager is found) CompilationRedirection.Stop(); using (CompilationProcessor manager = CompilationProcessor.Create(GetOriginal, addDiagnostic, getDiagnostics)) { manager.RegisterAttributes(compilation.Assembly); // Edit the compilation, and emit it. if (manager.TryEditCompilation(compilation, cancellationToken, out CSharpCompilation _, out object moduleBuilder)) { // No error, we can keep going context.ReturnValue = moduleBuilder; addDiagnostic(Diagnostic.Create( id: "ProcessSuccess", category: Common.DiagnosticsCategory, message: "Successfully edited the emitted compilation.", severity: DiagnosticSeverity.Info, defaultSeverity: DiagnosticSeverity.Info, isEnabledByDefault: true, warningLevel: -1, isSuppressed: false)); }
/// <summary> /// See interface docs. /// </summary> /// <param name="pathFromRoot"></param> /// <param name="redirectToPathFromRoot"></param> /// <param name="redirectionContext"></param> public void AddRedirection(string pathFromRoot, string redirectToPathFromRoot, RedirectionContext redirectionContext) { if (String.IsNullOrEmpty(pathFromRoot)) { throw new ArgumentException(nameof(pathFromRoot)); } if (String.IsNullOrEmpty(redirectToPathFromRoot)) { throw new ArgumentException(nameof(redirectToPathFromRoot)); } lock (_SyncLock) { List <Redirection> liveRedirectList; List <Redirection> redirectList; var redirections = CollectionHelper.ShallowCopy(_Redirections); if (redirections.TryGetValue(pathFromRoot, out liveRedirectList)) { redirectList = CollectionHelper.ShallowCopy(liveRedirectList); redirections[pathFromRoot] = redirectList; } else { redirectList = new List <Redirection>(); redirections.Add(pathFromRoot, redirectList); } var redirection = new Redirection(redirectToPathFromRoot, redirectionContext); var existingIndex = redirectList.FindIndex(r => r.RedirectionContext == redirectionContext); if (existingIndex > -1) { redirectList[existingIndex] = redirection; } else { redirectList.Add(redirection); } _Redirections = redirections; } }
/// <summary> /// Creates a new object. /// </summary> /// <param name="toPath"></param> /// <param name="context"></param> public Redirection(string toPath, RedirectionContext context) { ToPath = toPath; RedirectionContext = context; }