示例#1
0
        /// <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;
            }
        }
示例#2
0
        /// <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));
                }
示例#3
0
        /// <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;
            }
        }
示例#4
0
 /// <summary>
 /// Creates a new object.
 /// </summary>
 /// <param name="toPath"></param>
 /// <param name="context"></param>
 public Redirection(string toPath, RedirectionContext context)
 {
     ToPath             = toPath;
     RedirectionContext = context;
 }