package org.simantics.scl.compiler.source.repository; import gnu.trove.procedure.TObjectProcedure; import org.simantics.scl.compiler.module.repository.UpdateListener; import org.simantics.scl.compiler.source.ModuleSource; public class CompositeModuleSourceRepository implements ModuleSourceRepository { public final ModuleSourceRepository[] children; public CompositeModuleSourceRepository(ModuleSourceRepository ... children) { this.children = children; } @Override public ModuleSource getModuleSource(String moduleName, UpdateListener listener) { ModuleSource result = null; for(ModuleSourceRepository sourceRepository : children) { ModuleSource source = sourceRepository.getModuleSource(moduleName, listener); if(source != null) { if(result != null) { double resultPriority = result.getPriority(); double sourcePriority = source.getPriority(); if(resultPriority > sourcePriority) continue; if(resultPriority == sourcePriority) throw new RuntimeException("Module " + moduleName + " has two sources " + result + ", " + source + " with the same priority."); } result = source; } } return result; } @Override public String getDocumentation(String documentationName) { for(ModuleSourceRepository sourceRepository : children) { String documentation = sourceRepository.getDocumentation(documentationName); if(documentation != null) return documentation; } return null; } @Override public void forAllModules(TObjectProcedure procedure) { for(ModuleSourceRepository sourceRepository : children) sourceRepository.forAllModules(procedure); } @Override public void forAllDocumentations(TObjectProcedure procedure) { for(ModuleSourceRepository sourceRepository : children) sourceRepository.forAllDocumentations(procedure); } @Override public void checkUpdates() { } @Override public void clear() { for (ModuleSourceRepository child : children) child.clear(); } }