@@ -150,13 +150,13 @@ ModuleStatus getImportAndExtendGraph(str qualifiedModuleName, ModuleStatus ms){
150150 }
151151 if (mloc .extension != "rsc" || isModuleLocationInLibs (qualifiedModuleName , mloc , pcfg )) throw "No src or library module 1" ; //There is only a tpl file available
152152 } catch value _:{
153- <incompatible , ms > = isCompatibleBinaryLibrary (tm , domain ( localImportsAndExtends ), ms );
153+ <incompatible , ms > = isCompatibleBinaryLibrary (tm , ms );
154154 if (!isEmpty (incompatible )){
155- txt = "Recompilation or reconfiguration needed: binary module `<qualifiedModuleName > ` uses incompatible modules <intercalateAnd (incompatible )> " ;
155+ txt = "Recompilation or reconfiguration needed: binary module `<qualifiedModuleName > ` uses incompatible module(s) <intercalateAnd (incompatible )> " ;
156156 msg = error (txt , mloc );
157157 tm .messages += [msg ];
158158 ms .messages [qualifiedModuleName ] ? {} += { msg };
159- throw rascalBinaryNeedsRecompilation (txt );
159+ throw rascalBinaryNeedsRecompilation (qualifiedModuleName , msg );
160160 } else {
161161 allImportsAndExtendsValid = true ;
162162 if (ms .compilerConfig .verbose ){
@@ -211,39 +211,67 @@ ModuleStatus getInlineImportAndExtendGraph(Tree pt, RascalCompilerConfig ccfg){
211211 return completeModuleStatus (ms );
212212}
213213
214- // Example: |rascal+function:///util/Math/round$d80e373d64c01979| ==> util::Math
215- str getModuleFromLogical (loc l ){
216- i = findLast (l .path [1 ..], "/" );
217- res = i >= 0 ? l .path [1 ..i +1 ] : l .path [1 ..];
218- return replaceAll (res , "/" , "::" );
219- }
220-
221- // Is what library module lib provides compatible with all uses in the modules libUsers?
222- tuple [list [str ], ModuleStatus ] isCompatibleBinaryLibrary (TModel lib , set [str ] libUsers , ModuleStatus ms ){
223-
214+ // Is binary library module compatible with its dependencies (originating from imports and extends)?
215+ tuple [list [str ], ModuleStatus ] isCompatibleBinaryLibrary (TModel lib , ModuleStatus ms ){
224216 libName = lib .modelName ;
225- set [loc ] libProvides = domain (lib .logical2physical );
226- set [str ] libProvidesModules = { getModuleFromLogical (l ) | l <- libProvides };
227- set [loc ] usersRequire = {};
228- for (m <- libUsers ){
217+ set [loc ] libLogical = domain (lib .logical2physical );
218+ set [loc ] libDefines = { l | l <- libLogical , getModuleFromLogical (l ) == libName };
219+ set [loc ] libDependsOn = libLogical - libDefines ;
220+ set [str ] libDependsOnModules = { getModuleFromLogical (l ) | l <- libDependsOn };
221+ set [loc ] dependentsProvide = {};
222+ for (m <- libDependsOnModules ){
229223 <found , tm , ms > = getTModelForModule (m , ms );
230224 if (found ){
231- usersRequire += domain (tm .logical2physical );
225+ dependentsProvide += domain (tm .logical2physical );
232226 }
233227 }
234- usersRequireFromLib = { l | l <- usersRequire , getModuleFromLogical (l ) in libProvidesModules };
235-
236- if (usersRequireFromLib <= libProvides ){
237- //println("isCompatibleBinaryLibrary <libName>: satisfied");
228+ unsatisfied = libDependsOn - dependentsProvide ;
229+ if (isEmpty (unsatisfied )){
230+ println ("isCompatibleBinaryLibrary <libName > : satisfied" );
238231 return <[], ms >;
239232 } else {
240- //println("isCompatibleBinaryLibrary, <libName> unsatisfied: <usersRequireFromLib - libProvides>");
241- unsatisfied = usersRequireFromLib - libProvides ;
233+ println ("isCompatibleBinaryLibrary, <libName > unsatisfied: <unsatisfied > " );
242234 incompatibleModules = { split ("/" , u .path )[1 ] | u <- unsatisfied };
243235 return <toList (incompatibleModules ), ms >;
244236 }
245237}
246238
239+ // Example: |rascal+function:///util/Math/round$d80e373d64c01979| ==> util::Math
240+ // Example: |rascal+module:///lang/rascal/syntax/Rascal| -> lang::rascal::syntax::Rascal
241+ str getModuleFromLogical (loc l ){
242+ i = findLast (l .path [1 ..], "/" );
243+ res = (l .scheme == "rascal+module" || i < 0 ) ? l .path [1 ..] : l .path [1 ..i +1 ];
244+ res = replaceAll (res , "/" , "::" );
245+ //println("getModuleFromLogical: <l> -\> <res>");
246+ return res ;
247+ }
248+
249+ // // Is what library module lib provides compatible with all uses in the modules libUsers?
250+ // tuple[list[str], ModuleStatus] isCompatibleBinaryLibrary(TModel lib, set[str] libUsers, ModuleStatus ms){
251+
252+ // libName = lib.modelName;
253+ // set[loc] libProvides = domain(lib.logical2physical);
254+ // set[str] libProvidesModules = { getModuleFromLogical(l) | l <- libProvides };
255+ // set[loc] usersRequire = {};
256+ // for(m <- libUsers){
257+ // <found, tm, ms> = getTModelForModule(m, ms);
258+ // if(found){
259+ // usersRequire += domain(tm.logical2physical);
260+ // }
261+ // }
262+ // usersRequireFromLib = { l | l <- usersRequire, getModuleFromLogical(l) in libProvidesModules };
263+
264+ // if(usersRequireFromLib <= libProvides){
265+ // //println("isCompatibleBinaryLibrary <libName>: satisfied");
266+ // return <[], ms>;
267+ // } else {
268+ // println("isCompatibleBinaryLibrary, <libName> unsatisfied: <usersRequireFromLib - libProvides>");
269+ // unsatisfied = usersRequireFromLib - libProvides;
270+ // incompatibleModules = { split("/", u.path)[1] | u <- unsatisfied };
271+ // return <toList(incompatibleModules), ms>;
272+ // }
273+ // }
274+
247275tuple [bool , ModuleStatus ] importsAndExtendsAreBinaryCompatible (TModel tm , set [str ] importsAndExtends , ModuleStatus ms ){
248276 moduleName = tm .modelName ;
249277 physical2logical = invertUnique (tm .logical2physical );
0 commit comments