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%2Fmodule%2Frepository%2FModuleRepository.java;h=0f0b8542049a53c7f8eea2667ba15c40789f0f7b;hp=089f2c26c95469e639176ed9f50136b91a9c46c7;hb=7444d4b3a2f3c25fac462d8a168898656dafd52e;hpb=ebc97f6c97f17361be376f530b3538c0c9802a89 diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/repository/ModuleRepository.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/repository/ModuleRepository.java index 089f2c26c..0f0b85420 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/repository/ModuleRepository.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/repository/ModuleRepository.java @@ -10,6 +10,7 @@ import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.compilation.CompilationContext; import org.simantics.scl.compiler.elaboration.modules.SCLValue; import org.simantics.scl.compiler.environment.ConcreteEnvironment; +import org.simantics.scl.compiler.environment.EmptyEnvironment; import org.simantics.scl.compiler.environment.Environment; import org.simantics.scl.compiler.environment.NamespaceImpl.ModuleImport; import org.simantics.scl.compiler.environment.NamespaceSpec; @@ -20,6 +21,7 @@ import org.simantics.scl.compiler.errors.CompilationError; import org.simantics.scl.compiler.errors.DoesNotExist; import org.simantics.scl.compiler.errors.Failable; import org.simantics.scl.compiler.errors.Failure; +import org.simantics.scl.compiler.errors.Locations; import org.simantics.scl.compiler.errors.Success; import org.simantics.scl.compiler.module.ImportDeclaration; import org.simantics.scl.compiler.module.Module; @@ -37,6 +39,7 @@ import org.simantics.scl.compiler.top.ValueNotFound; import org.simantics.scl.compiler.types.Types; import gnu.trove.map.hash.THashMap; +import gnu.trove.map.hash.TObjectLongHashMap; import gnu.trove.procedure.TObjectObjectProcedure; import gnu.trove.set.hash.THashSet; @@ -160,7 +163,7 @@ public class ModuleRepository { Collection dependencies = module.getDependencies(); THashMap moduleEntries; try { - moduleEntries = getModuleEntries(null, dependencies.toArray(new ImportDeclaration[dependencies.size()]), null); + moduleEntries = getModuleEntries(null, dependencies.toArray(new ImportDeclaration[dependencies.size()]), null, false); } catch (ImportFailureException e) { throw new InternalCompilerError(e); } @@ -257,15 +260,16 @@ public class ModuleRepository { private THashMap getModuleEntries( CompilationContext compilationContext, ImportDeclaration[] imports, - UpdateListener listener) throws ImportFailureException { + UpdateListener listener, + boolean robustly) throws ImportFailureException { THashMap result = new THashMap(); Collection failures = null; - THashSet originalImports = new THashSet(); + TObjectLongHashMap originalImports = new TObjectLongHashMap(); ArrayList stack = new ArrayList(imports.length); for(ImportDeclaration import_ : imports) { stack.add(import_); - originalImports.add(import_.moduleName); + originalImports.put(import_.moduleName, import_.location); } while(!stack.isEmpty()) { ImportDeclaration import_ = stack.remove(stack.size()-1); @@ -278,8 +282,10 @@ public class ModuleRepository { stack.addAll(compilationResult.getResult().getDependencies()); if(originalImport) { String deprecation = compilationResult.getResult().getDeprecation(); - if(deprecation != null && compilationContext != null) - compilationContext.errorLog.logWarning(import_.location, "Deprecated module " + import_.moduleName + (deprecation.isEmpty() ? "." : ": " + deprecation)); + if(deprecation != null && compilationContext != null) { + long location = originalImport ? originalImports.get(import_.moduleName) : Locations.NO_LOCATION; + compilationContext.errorLog.logWarning(location, "Deprecated module " + import_.moduleName + (deprecation.isEmpty() ? "." : ": " + deprecation)); + } } } else { @@ -293,7 +299,7 @@ public class ModuleRepository { } } - if(failures != null) + if(failures != null && !robustly) throw new ImportFailureException(failures); return result; @@ -333,11 +339,25 @@ public class ModuleRepository { CompilationContext compilationContext, ImportDeclaration[] imports, UpdateListener listener) throws ImportFailureException { - THashMap entries = getModuleEntries(compilationContext, imports, listener); + THashMap entries = getModuleEntries(compilationContext, imports, listener, false); THashMap moduleMap = mapEntriesToModules(entries); return createEnvironment(moduleMap, imports); } + public Environment createEnvironmentRobustly( + CompilationContext compilationContext, + ImportDeclaration[] imports, + UpdateListener listener) { + try { + THashMap entries = getModuleEntries(compilationContext, imports, listener, true); + THashMap moduleMap = mapEntriesToModules(entries); + return createEnvironment(moduleMap, imports); + } catch(ImportFailureException e) { + // Should not happen because of robust flag + return EmptyEnvironment.INSTANCE; + } + } + public Environment createEnvironment( EnvironmentSpecification specification, UpdateListener listener) throws ImportFailureException { @@ -349,6 +369,10 @@ public class ModuleRepository { return createRuntimeEnvironment(environmentSpecification, parentClassLoader, null); } + public RuntimeEnvironment createRuntimeEnvironment(EnvironmentSpecification environmentSpecification) throws ImportFailureException { + return createRuntimeEnvironment(environmentSpecification, getClass().getClassLoader()); + } + public RuntimeEnvironment createRuntimeEnvironment( EnvironmentSpecification environmentSpecification, ClassLoader parentClassLoader, @@ -363,7 +387,7 @@ public class ModuleRepository { ImportDeclaration[] imports, ClassLoader parentClassLoader, UpdateListener listener) throws ImportFailureException { - THashMap entries = getModuleEntries(null, imports, listener); + THashMap entries = getModuleEntries(null, imports, listener, false); THashMap moduleMap = mapEntriesToModules(entries); Environment environment = createEnvironment(moduleMap, imports); THashMap runtimeModuleMap = mapEntriesToRuntimeModules(entries);