Report unused rules (Closes #200)
parent
851d8edfdd
commit
6500189d58
@ -0,0 +1,31 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Checks that all rules are used.
|
||||||
|
function reportUnusedRules( ast, session, options ) {
|
||||||
|
|
||||||
|
const used = {};
|
||||||
|
function yes( node ) {
|
||||||
|
|
||||||
|
used[ node.name || node ] = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
options.allowedStartRules.forEach( yes );
|
||||||
|
session.buildVisitor( { rule_ref: yes } )( ast );
|
||||||
|
|
||||||
|
ast.rules.forEach( rule => {
|
||||||
|
|
||||||
|
if ( used[ rule.name ] !== true ) {
|
||||||
|
|
||||||
|
session.warn(
|
||||||
|
`Rule "${ rule.name }" is not referenced.`,
|
||||||
|
rule.location
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = reportUnusedRules;
|
@ -0,0 +1,64 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
const chai = require( "chai" );
|
||||||
|
const helpers = require( "./helpers" );
|
||||||
|
const pass = require( "pegjs-dev" ).compiler.passes.check.reportUnusedRules;
|
||||||
|
|
||||||
|
chai.use( helpers );
|
||||||
|
|
||||||
|
const expect = chai.expect;
|
||||||
|
|
||||||
|
describe( "compiler pass |reportUnusedRules|", function () {
|
||||||
|
|
||||||
|
it( "should report rules that are not referenced", function () {
|
||||||
|
|
||||||
|
expect( pass ).to.reportWarning(
|
||||||
|
`
|
||||||
|
start = .
|
||||||
|
unused = .
|
||||||
|
`,
|
||||||
|
`Rule "unused" is not referenced.`
|
||||||
|
);
|
||||||
|
|
||||||
|
expect( pass ).to.reportWarning(
|
||||||
|
`
|
||||||
|
start = .
|
||||||
|
unused = .
|
||||||
|
used = .
|
||||||
|
`,
|
||||||
|
[
|
||||||
|
`Rule "used" is not referenced.`,
|
||||||
|
`Rule "unused" is not referenced.`
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
} );
|
||||||
|
|
||||||
|
it( "does not report rules that are referenced", function () {
|
||||||
|
|
||||||
|
expect( pass ).not.to.reportWarning( `start = .` );
|
||||||
|
|
||||||
|
expect( pass ).not.to.reportWarning( `
|
||||||
|
start = used
|
||||||
|
used = .
|
||||||
|
` );
|
||||||
|
|
||||||
|
} );
|
||||||
|
|
||||||
|
it( "does not report any rules that the generated parser starts parsing from", function () {
|
||||||
|
|
||||||
|
expect( pass ).not.to.reportWarning(
|
||||||
|
`
|
||||||
|
a = "x"
|
||||||
|
b = a
|
||||||
|
c = .+
|
||||||
|
`,
|
||||||
|
null,
|
||||||
|
{
|
||||||
|
allowedStartRules: [ "b", "c" ]
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
} );
|
||||||
|
|
||||||
|
} );
|
Loading…
Reference in New Issue