lib/qx/tool/compiler/Analyser.js
function(library, locales) {
      const Promisify = qx.tool.compiler.utils.Promisify;
      
      return Promise.all(locales.map(locale => {
        var translation = new qx.tool.compiler.app.Translation(library, locale);
        return translation.read()
        .then(() => {
          let unusedEntries = {};
          for (let msgid in translation.getEntries())
            unusedEntries[msgid] = true;
          
          return Promise.all(this.__classes.map(async classname => {
            if (!classname.startsWith(library.getNamespace())) {
              return;
            }
            
            let dbClassInfo = await Promisify.call(cb => this.getClassInfo(classname, cb));
            if (!dbClassInfo.translations)
              return;
            
            dbClassInfo.translations.forEach(function(src) {
              var entry = translation.getOrCreateEntry(src.msgid);
              delete unusedEntries[src.msgid];
              if (src.msgid_plural) {
                entry.msgid_plural = src.msgid_plural;
              }
              if (!entry.comments) {
                entry.comments = {}; 
              }
              entry.comments.extracted = src.comment; 
              entry.comments.reference = {};
              let ref = entry.comments.reference;
              const fileName = classname.replace(/\./g, "/") + ".js";
              const fnAddReference = lineNo => {
                let arr = ref[fileName];
                if (!arr)
                  arr = ref[fileName] = [];
                
                if (!arr.includes(src.lineNo)) {
                  arr.push(lineNo);
                }
              };
              if (qx.lang.Type.isArray(src.lineNo)) {
                src.lineNo.forEach(fnAddReference);
              } else {
                fnAddReference(src.lineNo);
              }
            });
          }))
          .then(() => {
            Object.keys(unusedEntries).forEach(msgid => {
              var entry = translation.getEntry(msgid);
              if (entry) {
                if (!entry.comments) {
                  entry.comments = {}; 
                }
                entry.comments.extracted = "NO LONGER USED"; 
                entry.comments.reference = {};
              }
            });
          });
        })
        .then(() => translation.write());
      }));
    }
function(library, locales) {
      const Promisify = qx.tool.compiler.utils.Promisify;
      
      return Promise.all(locales.map(locale => {
        var translation = new qx.tool.compiler.app.Translation(library, locale);
        return translation.read()
        .then(() => {
          let unusedEntries = {};
          for (let msgid in translation.getEntries())
            unusedEntries[msgid] = true;
          
          return Promise.all(this.__classes.map(async classname => {
            if (!classname.startsWith(library.getNamespace())) {
              return;
            }
            
            let dbClassInfo = await Promisify.call(cb => this.getClassInfo(classname, cb));
            if (!dbClassInfo.translations)
              return;
            
            dbClassInfo.translations.forEach(function(src) {
              var entry = translation.getOrCreateEntry(src.msgid);
              delete unusedEntries[src.msgid];
              if (src.msgid_plural) {
                entry.msgid_plural = src.msgid_plural;
              }
              if (!entry.comments) {
                entry.comments = {}; 
              }
              entry.comments.extracted = src.comment; 
              entry.comments.reference = {};
              let ref = entry.comments.reference;
              const fileName = classname.replace(/\./g, "/") + ".js";
              const fnAddReference = lineNo => {
                let arr = ref[fileName];
                if (!arr)
                  arr = ref[fileName] = [];
                
                if (!arr.includes(src.lineNo)) {
                  arr.push(lineNo);
                }
              };
              if (qx.lang.Type.isArray(src.lineNo)) {
                src.lineNo.forEach(fnAddReference);
              } else {
                fnAddReference(src.lineNo);
              }
            });
          }))
          .then(() => {
            Object.keys(unusedEntries).forEach(msgid => {
              var entry = translation.getEntry(msgid);
              if (entry) {
                if (!entry.comments) {
                  entry.comments = {}; 
                }
                entry.comments.extracted = "NO LONGER USED"; 
                entry.comments.reference = {};
              }
            });
          });
        })
        .then(() => translation.write());
      }));
    }
Updates all translations to include all msgids found in code
@param the library to update
@param locales
@param cb