@htmlacademy/ast-check

1.0.57 • Public • Published

ast-check

Сравнивает переданное ast-дерево с заранее описанным.

Build Status

Usage

var matcher = require('ast-check').matcher;

var m = matcher();

m.
  // We define goals to match some code
  goal('init.var').
    code('var i = "#var.value"'). // "#fragment.name" will be replaced
                                  //   with fragment's code on matching
    assign('var.value', 'value.answer').
  // Several goals may be defined to inherit code
  goal('init.var.parrots').
    // Just take another goal
    takes('init.var').
    // And reassign some of fragments
    assign('var.value', 'value.parrots').
  goal('init.var.variants').
    takes('init.var').
    // When several variants are possible..
    assign('var.value', 'value.variants').
  goal('init.var.anything').
    // When we need wildcard in init part
    assign('var.value', 'builtin.anything').
  fragment('value.answer').
    code('42').
  fragment('value.parrots').
    code('38').
  fragment('value.variants').
    code('38', '42'); // fragment's code may have several variants

m.match('init.var')('var i = 42'); // => true
m.match('init.var')('var i = 38'); // => false

m.match('init.var.parrots')('var i = 42'); // => false
m.match('init.var.parrots')('var i = 38'); // => true

m.match('init.var.variants')('var i = 38'); // => true
m.match('init.var.variants')('var i = 42'); // => true

m.match('init.var.anything')('var i = 404'); // => true

Ограничения

builtin.anything

Следует избегать использования builtin.anything в конце фрагмента, т.к. если фрагмент использован внутри цели и заканчивается на всё, что угодно, проверка не будет знать где остановиться.

Вот так сравнение работать НЕ будет:

m.
  goal('wrong.way').code('"#f.1"; "#f.2"').
  fragment('f.1').code('var a = 1; "#builtin.anything"').
  fragment('f.2').code('var b = 2; "#builtin.anything"');

m.match('wrong.way')('var a = 1; var b = 2'); // => false
m.match('wrong.way')('var a = 1; var c = 3; var b = 2;'); // => false

Правильно будет сделать вот так:

m.
  goal('right.way').code('"#f.1"; "#f.2"; "#builtin.anything"').
  fragment('f.1').code('var a = 1').
  fragment('f.2').code('"#builtin.anything"; var b = 2');

m.match('right.way')('var a = 1; var b = 2'); // => true
m.match('right.way')('var a = 1; var c = 3; var b = 2;'); // => true

Отладка

Начиная с версии 1.0.13 добавлена возможность посмотреть, в каком именно месте проверка проваливается. Используется пакет debug. Сообщения о создании фрагментов и целей можно вывести в консоль, присвоив localStorage.debug значение 'ast:create:*', для просмотра сообщений по поводу сравнения узлов, фрагментов и целей нужно использовать значение 'ast:compare:*'.

Зависимости

Readme

Keywords

none

Package Sidebar

Install

npm i @htmlacademy/ast-check

Weekly Downloads

1

Version

1.0.57

License

MIT

Unpacked Size

100 kB

Total Files

56

Last publish

Collaborators

  • andreychap
  • kaineer
  • nakleikoff
  • expa
  • kam4atka