public IncrementalBuilder.Result build(
     final BuildRequest request,
     final Function1<? super URI, ? extends IResourceServiceProvider> languages,
     final IResourceClusteringPolicy clusteringPolicy) {
   try {
     final XtextResourceSet resourceSet = request.getResourceSet();
     IndexState _state = request.getState();
     ResourceDescriptionsData _resourceDescriptions = _state.getResourceDescriptions();
     ResourceDescriptionsData _copy = _resourceDescriptions.copy();
     IndexState _state_1 = request.getState();
     Source2GeneratedMapping _fileMappings = _state_1.getFileMappings();
     Source2GeneratedMapping _copy_1 = _fileMappings.copy();
     final IndexState oldState = new IndexState(_copy, _copy_1);
     CancelIndicator _cancelIndicator = request.getCancelIndicator();
     final BuildContext context =
         new BuildContext(languages, resourceSet, oldState, clusteringPolicy, _cancelIndicator);
     final IncrementalBuilder.InternalStatefulIncrementalBuilder builder = this.provider.get();
     builder.context = context;
     builder.request = request;
     try {
       return builder.launch();
     } catch (final Throwable _t) {
       if (_t instanceof Throwable) {
         final Throwable t = (Throwable) _t;
         this._operationCanceledManager.propagateIfCancelException(t);
         throw t;
       } else {
         throw Exceptions.sneakyThrow(_t);
       }
     }
   } catch (Throwable _e) {
     throw Exceptions.sneakyThrow(_e);
   }
 }
 protected void generate(
     final Resource resource,
     final BuildRequest request,
     final Source2GeneratedMapping newMappings) {
   URI _uRI = resource.getURI();
   final IResourceServiceProvider serviceProvider =
       this.context.getResourceServiceProvider(_uRI);
   final GeneratorDelegate generator =
       serviceProvider.<GeneratorDelegate>get(GeneratorDelegate.class);
   boolean _equals = Objects.equal(generator, null);
   if (_equals) {
     return;
   }
   URI _uRI_1 = resource.getURI();
   final Set<URI> previous = newMappings.deleteSource(_uRI_1);
   URIBasedFileSystemAccess _createFileSystemAccess =
       this.createFileSystemAccess(serviceProvider, resource);
   final Procedure1<URIBasedFileSystemAccess> _function =
       new Procedure1<URIBasedFileSystemAccess>() {
         @Override
         public void apply(final URIBasedFileSystemAccess it) {
           final URIBasedFileSystemAccess.BeforeWrite _function =
               new URIBasedFileSystemAccess.BeforeWrite() {
                 @Override
                 public InputStream beforeWrite(
                     final URI uri, final String outputCfgName, final InputStream contents) {
                   URI _uRI = resource.getURI();
                   newMappings.addSource2Generated(_uRI, uri, outputCfgName);
                   previous.remove(uri);
                   Procedure2<? super URI, ? super URI> _afterGenerateFile =
                       request.getAfterGenerateFile();
                   URI _uRI_1 = resource.getURI();
                   _afterGenerateFile.apply(_uRI_1, uri);
                   return contents;
                 }
               };
           it.setBeforeWrite(_function);
           final URIBasedFileSystemAccess.BeforeDelete _function_1 =
               new URIBasedFileSystemAccess.BeforeDelete() {
                 @Override
                 public boolean beforeDelete(final URI uri) {
                   newMappings.deleteGenerated(uri);
                   Procedure1<? super URI> _afterDeleteFile = request.getAfterDeleteFile();
                   _afterDeleteFile.apply(uri);
                   return true;
                 }
               };
           it.setBeforeDelete(_function_1);
         }
       };
   final URIBasedFileSystemAccess fileSystemAccess =
       ObjectExtensions.<URIBasedFileSystemAccess>operator_doubleArrow(
           _createFileSystemAccess, _function);
   fileSystemAccess.setContext(resource);
   boolean _isWriteStorageResources = request.isWriteStorageResources();
   if (_isWriteStorageResources) {
     boolean _matched = false;
     if (resource instanceof StorageAwareResource) {
       IResourceStorageFacade _resourceStorageFacade =
           ((StorageAwareResource) resource).getResourceStorageFacade();
       boolean _notEquals = (!Objects.equal(_resourceStorageFacade, null));
       if (_notEquals) {
         _matched = true;
         IResourceStorageFacade _resourceStorageFacade_1 =
             ((StorageAwareResource) resource).getResourceStorageFacade();
         _resourceStorageFacade_1.saveResource(
             ((StorageAwareResource) resource), fileSystemAccess);
       }
     }
   }
   final GeneratorContext generatorContext = new GeneratorContext();
   CancelIndicator _cancelIndicator = request.getCancelIndicator();
   generatorContext.setCancelIndicator(_cancelIndicator);
   generator.generate(resource, fileSystemAccess, generatorContext);
   final Procedure1<URI> _function_1 =
       new Procedure1<URI>() {
         @Override
         public void apply(final URI it) {
           try {
             IncrementalBuilder.InternalStatefulIncrementalBuilder.LOG.info(
                 ("Deleting stale generated file " + it));
             XtextResourceSet _resourceSet =
                 InternalStatefulIncrementalBuilder.this.context.getResourceSet();
             URIConverter _uRIConverter = _resourceSet.getURIConverter();
             Map<Object, Object> _emptyMap = CollectionLiterals.<Object, Object>emptyMap();
             _uRIConverter.delete(it, _emptyMap);
             Procedure1<? super URI> _afterDeleteFile = request.getAfterDeleteFile();
             _afterDeleteFile.apply(it);
           } catch (Throwable _e) {
             throw Exceptions.sneakyThrow(_e);
           }
         }
       };
   IterableExtensions.<URI>forEach(previous, _function_1);
 }