Move purely PSI checks of contract presence to ktPsiUtil.kt

This commit is contained in:
Dmitry Savvinov
2018-07-19 18:55:29 +03:00
parent 5275e19c76
commit b943140f3a
3 changed files with 18 additions and 14 deletions
@@ -291,6 +291,21 @@ inline fun <reified T : KtElement, R> flatMapDescendantsOfTypeVisitor(
return forEachDescendantOfTypeVisitor<T> { accumulator.addAll(map(it)) }
}
// ----------- Contracts -------------------------------------------------------------------------------------------------------------------
fun fastCheckIfContractPresent(element: KtElement): Boolean {
if (!isContractAllowedHere(element)) return false
val firstExpression = ((element as? KtFunction)?.bodyExpression as? KtBlockExpression)?.statements?.firstOrNull() ?: return false
return isContractDescriptionCallFastCheck(firstExpression)
}
private fun isContractAllowedHere(element: KtElement): Boolean =
element is KtNamedFunction && element.isTopLevel && element.hasBlockBody() && !element.hasModifier(KtTokens.OPERATOR_KEYWORD)
fun isContractDescriptionCallFastCheck(expression: KtExpression): Boolean =
expression is KtCallExpression && expression.calleeExpression?.text == "contract"
// ----------- Other -----------------------------------------------------------------------------------------------------------------------
fun KtClassOrObject.effectiveDeclarations(): List<KtDeclaration> {