/* JavaScript arrays seems the most efficient choice for keeping Warning 
 * structures. Warning IDs will not be constrained to small number, and there is 
 * no requirement that there are no holes in the sequence of IDs. Also, it is 
 * important to minimize the search time so any type of the unordered list can't
 * be used. XDCscript arrays are not good because they are not sparse, XDCscript 
 * maps are not good because we can't force the maps to use string keys as
 * indices for the underlying Java Vector. For example, the following sequence:
 * Map.add("1", WARN1);
 * Map.add("3", WARN2);
 * causes the first entry to be added as Map[0], and the second entry as Map[1].
 * We would have to add entries in a very constrained way to keep the key and
 * the index the same.
 *
 * The IDs are at the same time indices in the array, but also members of the
 * element structure. This means some information is duplicated, but for now I
 * will leave it as that because I set the ID in the structure to -1 to mark
 * the entry disabled.
 */
var warningsMap = [];

/* This function goes through the properties of the module and automatically 
 * enters Warnings in the array. If there is already an entry and the ID in
 * the element structure is -1, that warning should be skipped over. However, in 
 * the current sequence of function calls there is no need for it because 
 * disable() is called after module$meta$init, and module$meta$init is the only
 * place where new Warnings are added.
 */
function module$meta$init() {
    for (var prop in this) {
        if ("$$proto" in this[prop]
            && this[prop].$$proto == "xdc.Warnings.Warning") {
                warningsMap[this[prop].id] = this[prop];
        }
    }
}

function disable(ids) {
    for (var i = 0; i < ids.length; i++) {
        var id = Number(ids[i]);
        warningsMap[id] = new this.Warning({id: -1, msg: null});
    }
}

/* This function is called from $logWarning to get Warning specified in the
 * $logWarning call and to substitute %s with the actual strings.
 */
function getMessage(wp) {
    var id = wp.warning.id;
    if (warningsMap[id] == undefined) {
        return("_undf");
    }
    if (warningsMap[id].id == -1) {
        return("_dsbl");
    }

    var msg = "ID=" + id + ": " + warningsMap[id].msg;
    if (wp.args != undefined) {
        var i = 0;
        var tmpmsg = msg.replace(/%s/g, function() {
            var ret = (i < wp.args.length) ? wp.args[i] : "";
            i++;
            return(ret);
        });
        msg = tmpmsg;
    }
    return(msg);
}
