X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Fsource%2Frepository%2FCompositeModuleSourceRepository.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Fsource%2Frepository%2FCompositeModuleSourceRepository.java;h=ce3f775ce969ddb756064146dae9ba1e82dc4f50;hp=0000000000000000000000000000000000000000;hb=969bd23cab98a79ca9101af33334000879fb60c5;hpb=866dba5cd5a3929bbeae85991796acb212338a08 diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/CompositeModuleSourceRepository.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/CompositeModuleSourceRepository.java new file mode 100644 index 000000000..ce3f775ce --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/CompositeModuleSourceRepository.java @@ -0,0 +1,68 @@ +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(); + } +}