npm package: @htmlacademy/ast-check
Description: Check ast to match criterions
Author: Tangerine Cat
Latest version: 1.0.57

ast-check
=========

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

[![Build Status](https://travis-ci.org/kaineer/ast-check.svg?branch=master)](https://travis-ci.org/kaineer/ast-check)

Usage
-----

```javascript
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` в конце фрагмента, т.к. если фрагмент использован внутри цели и заканчивается на всё, что угодно, проверка не будет знать где остановиться.


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

```javascript
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
```

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

```javascript
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](https://www.npmjs.com/package/debug). Сообщения о создании фрагментов и целей можно вывести в консоль, присвоив `localStorage.debug` значение `'ast:create:*'`, для просмотра сообщений по поводу сравнения узлов, фрагментов и целей нужно использовать значение `'ast:compare:*'`.

Зависимости
-----------

 * [acorn](https://www.npmjs.com/package/acorn)
 * [estraverse](https://www.npmjs.com/package/estraverse)
 * [debug](https://www.npmjs.com/package/debug)