Дополнение по локации

Есть ли способ добавить 2 местоположения с определенной строкой и столбцом друг с другом?

Что-то вроде:

|project://MyProject/src/MyClass.java|(962,10,<39,2>,<39,12>) + |project://MyProject/src/MyClass.java|(975,53,<40,2>,<40,55>);

В результате:

 |project://MyProject/src/MyClass.java|(962,66,<39,2>,<40,55>)

В настоящее время я работаю с AST, и я хочу выбрать блок, но я не мог найти, как это сделать, поэтому я попытался добавить местоположение каждого оператора, но это не сработает.


person Karl-John Chow    schedule 06.12.2014    source источник


Ответы (2)


Основываясь на ответе Пола, это также обрабатывает типичный случай, когда между вторым местоположением и первым есть «пробел» (возможно, пробел):

loc add(loc s, loc r) {
    res = s;
    res.end = r.end;
    adjust = 0;
    if (s.offset + s.length < r.offset) {
        adjust = r.offset - (s.offset+s.length);
    }
    res.length = s.length + r.length + adjust;
    return res;
}

Вы определенно должны быть осторожны с этим, однако - есть множество случаев и возможных условий ошибки, которые это не обрабатывает (например, местоположения перекрываются, местоположения передаются в неправильном порядке, местоположения на самом деле из разных файлов). Однако он должен обрабатывать только «объединяющие» местоположения для двух соседних конструкций.

person Mark Hills    schedule 06.12.2014

Интересное наблюдение. Дополнение по нужным вам локациям на данный момент не предусмотрено как встроенная операция (но мы можем рассмотреть возможность его добавления).

Кроме того: поддерживается добавление местоположения и строки :

rascal>|project://MyProject/src| + "MyClass.java";
loc: |project://MyProject/src/MyClass.java|

Если вы посмотрите на описание местоположений вы сами найдете все ингредиенты для создания дополнений на локациях. Например, это будет делать:

loc add(loc s, loc r) {
    res = s;
    res.end = r.end;
    res.length = s.length + r.length;
    return res;
}

Это даст вам:

rascal>add(|project://MyProject/src/MyClass.java|(962,10,<39,2>,<39,12>),   |project://MyProject/src/MyClass.java|(975,53,<40,2>,<40,55>));
loc: |project://MyProject/src/MyClass.java|(962,63,<39,2>,<40,55>)

Приведенное выше решение не справляется с этим случаем, когда местоположения перекрываются (но я не хотел слишком запутывать решение).

Надеюсь это поможет.

person Paul Klint    schedule 06.12.2014
comment
Приведенный выше ответ был отредактирован по предложению stackoverflow.com/users/2382373/mark-hills. - person Paul Klint; 06.12.2014