2017-01-24 3 views
2

У нас есть правило swiftlint, которое в основном обеспечивает префикс для наших структур, классов и протоколов (DC, DB или DM в зависимости от функции). Мы хотим сопоставить это только с объектами верхнего уровня, например. в приведенном ниже примере, я хотел бы только TopLevel и SecondTopLevel бросить ошибку:Как совместить объекты верхнего уровня в swiftlint

class TopLevel { 

    struct NotTopLevel { 
     var test 
    } 

} 

class SecondTopLevel { 

} 

Наш текущий регулярное выражение выглядит следующим образом: (struct|class|protocol)\s(?!(func|DB|DC|DM))[^\n\r]+\{, и это будет соответствовать как TopLevel и NotTopLevel. Я хотел бы как-то дать некоторое regex (или какой-нибудь другой инструмент swiftlint) не соответствовать NotTopLevel, но по-прежнему соответствовать TopLevel и SecondTopLevel. Это возможно? Есть идеи о том, как это сделать?

Подход, который я пытался подражать, состоит в том, чтобы искать 0 или более предыдущих определений классов перед проверкой нашего префикса, однако я сталкиваюсь с проблемами, которые пытаются сопоставить весь класс один или несколько раз, прежде чем проверять префикс.

+0

Можете ли вы предположить, что ваш отступ всегда согласован? – Faibbus

+0

Если вы не можете использовать отступы, чтобы найти уровень объявления, нет никакого способа сделать это с помощью обычного выражения. Независимо от того, какое регулярное выражение вы придумаете, всегда будет набор объявлений, которые сломают его. – Faibbus

ответ

2

Вы можете использовать

(struct|class|protocol).* 

так вы подходите только первый класс структуры или протокол.

Смежные вопросы