Beispiel #1
0
        public Task <CompilationResult> Compile(IFileInfo file, ITrace tracer)
        {
            Requires.NotNull(file, "file");
            Requires.NotNull(tracer, "tracer");

            // Generate a content id
            string contentId = ContentIdentifier.GenerateContentId(file);

            tracer.WriteLine("CompilationManager - Content ID: {0}", contentId);

            WeakReference <Type> cacheEntry;

            if (Cache.TryGetValue(contentId, out cacheEntry))
            {
                Type cached;
                if (cacheEntry.TryGetTarget(out cached))
                {
                    return(Task.FromResult(CompilationResult.FromCache(cached)));
                }
                else
                {
                    tracer.WriteLine("CompilationManager - Expired: {0}", contentId);
                    Cache.Remove(contentId);
                }
            }

            foreach (var compiler in _compilers)
            {
                if (compiler.CanCompile(file))
                {
                    tracer.WriteLine("CompilationManager - Selected compiler: '{0}'", compiler.GetType().Name);
                    return(CompileWith(compiler, contentId, file));
                }
            }

            return(Task.FromResult(CompilationResult.Failed(null, new[]
            {
                new CompilationMessage(
                    MessageLevel.Error,
                    Resources.DefaultCompilationManager_CannotFindCompiler,
                    new FileLocation(file.PhysicalPath ?? file.Name))
            })));
        }