2017-02-10 18 views
3

Я пишу макрос Scala и просматриваю дерево, чтобы найти не-частные поля в классах.Почему у этого публичного поля есть флаг PRIVATE?

Рассмотрим этот код, что макрос смотрит на:

class Foo { 
    val bar: String = "test" 
} 

Я обходе этот код и получить к bar «s ValDef. Он имеет только два флага в своих модификаторах: Flag.PRIVATE и Flag.LOCAL.

Использование модификатора private на bar ничего не меняет. Использование модификатора protected добавляет только Flag.PROTECTED к списку флагов.

Что мне не хватает? Как я могу провести различие между частными и общественными полями?

Edit:

Следующий код:

val bar: String = "test" 

имеет ни Flag.PRIVATE, ни Flag.LOCAL, что имеет смысл, так как это 'глобальный' общественный вал.

Контекст, в котором я работаю внутри, пишет новую бородавку для wartremover, которая просто принимает Traverser из юниверса контекста при расширении макроса и перемещается по блоку кода.

+3

Не могли бы вы поделиться своим кодом, чтобы мы могли поиграть с ним? – Dici

+0

Я мог бы создать репродукцию, если вам нравится, но код, который я использую, просто принимает Traverser из вселенной и запускает его в коде во время макрорасширения. –

+0

@ Dici Я добавил дополнительную информацию и контекст к вопросу. HTH –

ответ

2

A val определение в Scala расширилось до поля private[this] с дополнительным геттером. Помимо ValDef, вы видите, что должно быть дополнительное определение метода DefDef с тем же именем, которое является получателем в поле.

+1

Это точно! Спасибо :) –