]> git.immae.eu Git - github/fretlink/purs-loader.git/blobdiff - src/index.js
Watch foreign modules on compilation error
[github/fretlink/purs-loader.git] / src / index.js
index fce6394a85bd9978eebead971a428976c6934d76..be809c685ac5959cc011388259cea1026578102c 100644 (file)
@@ -190,16 +190,31 @@ module.exports = function purescriptLoader(source, map) {
     },
     emitError: pscMessage => {
       if (pscMessage.length) {
+        const modules = [];
+
         const matchErrorsSeparator = /\n(?=Error)/;
         const errors = pscMessage.split(matchErrorsSeparator);
         for (const error of errors) {
-          const matchErrLocation = /at (.+\.purs) line (\d+), column (\d+) - line (\d+), column (\d+)/;
+          const matchErrLocation = /at (.+\.purs):(\d+):(\d+) - (\d+):(\d+) \(line \2, column \3 - line \4, column \5\)/;
           const [, filename] = matchErrLocation.exec(error) || [];
           if (!filename) continue;
 
           const baseModulePath = path.join(this.rootContext, filename);
           this.addDependency(baseModulePath);
 
+          const foreignModulesErrorCodes = [
+            'ErrorParsingFFIModule',
+            'MissingFFIImplementations',
+            'UnusedFFIImplementations',
+            'MissingFFIModule'
+          ];
+          for (const code of foreignModulesErrorCodes) {
+            if (error.includes(code)) {
+              const resolved = utils.resolveForeignModule(baseModulePath);
+              this.addDependency(resolved);
+            }
+          }
+
           const matchErrModuleName = /in module ((?:\w+\.)*\w+)/;
           const [, baseModuleName] = matchErrModuleName.exec(error) || [];
           if (!baseModuleName) continue;
@@ -217,9 +232,26 @@ module.exports = function purescriptLoader(source, map) {
               this.addDependency(resolved);
             }
           }
+
+          const desc = {
+            name: baseModuleName,
+            filename: baseModulePath
+          };
+
+          if (typeof this.describePscError === 'function') {
+            const { dependencies = [], details } = this.describePscError(error, desc);
+
+            for (const dep of dependencies) {
+              this.addDependency(dep);
+            }
+
+            Object.assign(desc, details);
+          }
+
+          modules.push(desc);
         }
 
-        CACHE_VAR.errors.push(pscMessage);
+        CACHE_VAR.errors.push(new utils.PscError(pscMessage, modules));
       }
     }
   }