// narcissus.tree.equal.js
// 
// Copyright (c) 2010 Guillaume Lathoud
// MIT License
// 
// Compare two pieces of code (local variable names may differ).

/*global from narcissus*/

from.req('narcissus.code.compress.js')
('narcissus.code.equal.js', function () {

    narcissus.code.equal = function (/*string*/code_0, /*string*/code_1) {
        
        // We use `narcissus.code.compress` to eliminate variability
        // due to comments, spaces and local variable names.
        // 
        // In particular, `narcissus.code.compress` changes the local
        // variable names in a deterministic manner. Also, the change
        // does not depend on the variable names themselves (`true`
        // below).
        // 
        // We return `null` to signify "not sure": the programs may
        // still be 100% equal, e.g. with extra useless { } in
        // `code_1`.
        
        var c0 = narcissus.code.compress( code_0, true ) 
        ,   c1 = narcissus.code.compress( code_1, true )
        ;

        if (c0.errors.length !== 0)
            throw new Error('narcissus.code.equal: syntax error on `code_0`: ' + c0.errors[0].message);

        if (c1.errors.length !== 0)
            throw new Error('narcissus.code.equal: syntax error on `code_1`: ' + c1.errors[0].message);

        return ( c0.compressed_code === c1.compressed_code ) ? true : null;
        
    };

});

