in base/src/main/java/org/arend/library/SourceLibrary.java [201:317]
public boolean load(LibraryManager libraryManager, TypecheckingOrderingListener typechecking) {
if (isLoaded()) {
return true;
}
LibraryHeader header = loadHeader(libraryManager.getLibraryErrorReporter());
if (header == null) {
return false;
}
if (!header.languageVersionRange.inRange(Prelude.VERSION)) {
libraryManager.showIncorrectLanguageVersionError(getName(), header.languageVersionRange);
if (!mustBeLoaded()) {
return false;
}
}
MultiClassLoader<Library> classLoader = libraryManager.getClassLoader(isExternal());
if (header.classLoaderDelegate != null && header.extMainClass != null) {
classLoader.addDelegate(this, header.classLoaderDelegate);
}
Map<String, ArendExtension> dependenciesExtensions = new LinkedHashMap<>();
for (LibraryDependency dependency : header.dependencies) {
Library loadedDependency = libraryManager.loadDependency(this, dependency.name, typechecking);
if (loadedDependency == null && !mustBeLoaded()) {
classLoader.removeDelegate(this);
return false;
}
if (loadedDependency != null) {
libraryManager.registerDependency(this, loadedDependency);
dependenciesExtensions.put(dependency.name, loadedDependency.getArendExtension());
}
}
libraryManager.beforeLibraryLoading(this);
try {
Class<?> extMainClass = null;
if (header.classLoaderDelegate != null && header.extMainClass != null) {
extMainClass = classLoader.loadClass(header.extMainClass);
if (!ArendExtension.class.isAssignableFrom(extMainClass)) {
libraryManager.getLibraryErrorReporter().report(LibraryError.incorrectExtensionClass(getName()));
extMainClass = null;
}
}
if (extMainClass != null) {
myExtension = (ArendExtension) extMainClass.getDeclaredConstructor().newInstance();
}
} catch (Exception e) {
classLoader.removeDelegate(this);
libraryManager.getLibraryErrorReporter().report(new ExceptionError(e, "loading of library " + getName()));
}
SerializableKeyRegistryImpl keyRegistry = new SerializableKeyRegistryImpl();
if (myExtension == null) {
myExtension = new DefaultArendExtension();
}
myExtension.registerKeys(keyRegistry);
myExtension.setDependencies(dependenciesExtensions);
myExtension.setPrelude(new Prelude());
myExtension.setConcreteFactory(new ConcreteFactoryImpl(null));
myExtension.setVariableRenamerFactory(VariableRenamerFactoryImpl.INSTANCE);
ArendUI ui = getUI();
if (ui != null) {
myExtension.setUI(ui);
}
DefinitionContributorImpl contributor = new DefinitionContributorImpl(this, libraryManager.getLibraryErrorReporter(), myAdditionalModuleScopeProvider);
try {
myExtension.declareDefinitions(contributor);
} finally {
contributor.disable();
}
loadGeneratedModules();
Set<ModulePath> loaded = Collections.emptySet();
try {
SourceLoader sourceLoader = new SourceLoader(this, libraryManager);
if (hasRawSources()) {
Set<ModulePath> loadedRaw = sourceLoader.loadRawSources(header.modules, false);
if (loadedRaw.size() < header.modules.size()) {
for (ModulePath module : header.modules) {
if (!loadedRaw.contains(module)) {
libraryManager.getLibraryErrorReporter().report(new ModuleNotFoundError(module));
}
}
}
}
if (!myFlags.contains(Flag.RECOMPILE) || isExternal()) {
DefinitionListener definitionListener = ListDefinitionListener.join(libraryManager.getDefinitionListener(), myExtension.getDefinitionListener());
loaded = sourceLoader.loadBinarySources(header.modules, keyRegistry, definitionListener);
if (loaded.size() < header.modules.size() && !mustBeLoaded()) {
libraryManager.afterLibraryLoading(this, -1, header.modules.size());
return false;
}
}
} catch (Throwable e) {
libraryManager.afterLibraryLoading(this, -1, header.modules.size());
throw e;
}
myExtension.setDefinitionProvider(DefinitionProviderImpl.INSTANCE);
ArendDependencyProviderImpl provider = new ArendDependencyProviderImpl(typechecking, libraryManager.getAvailableModuleScopeProvider(this), libraryManager.getDefinitionRequester(), this);
try {
myExtension.load(provider);
} finally {
provider.disable();
}
libraryManager.afterLibraryLoading(this, loaded.size(), header.modules.size());
return super.load(libraryManager, typechecking);
}