Remove warnings in createByPattern.kt

This commit is contained in:
Nikolay Krasko
2018-10-19 16:02:49 +03:00
parent 4024d0c484
commit 77be4a9e85
3 changed files with 27 additions and 21 deletions
@@ -41,7 +41,7 @@ fun <TDeclaration : KtDeclaration> KtPsiFactory.createDeclarationByPattern(
pattern: String,
vararg args: Any,
reformat: Boolean = true
): TDeclaration = createByPattern(pattern, *args, reformat = reformat) { createDeclaration<TDeclaration>(it) }
): TDeclaration = createByPattern(pattern, *args, reformat = reformat) { createDeclaration(it) }
fun KtPsiFactory.createDestructuringDeclarationByPattern(
pattern: String,
@@ -109,8 +109,9 @@ private val SUPPORTED_ARGUMENT_TYPES = listOf(
PsiChildRangeArgumentType
)
@TestOnly
var CREATEBYPATTERN_MAY_NOT_REFORMAT = false
@get:TestOnly
@set:TestOnly
var CREATE_BY_PATTERN_MAY_NOT_REFORMAT = false
fun <TElement : KtElement> createByPattern(
pattern: String,
@@ -120,7 +121,10 @@ fun <TElement : KtElement> createByPattern(
): TElement {
val argumentTypes = args.map { arg ->
SUPPORTED_ARGUMENT_TYPES.firstOrNull { it.klass.isInstance(arg) }
?: throw IllegalArgumentException("Unsupported argument type: ${arg::class.java}, should be one of: ${SUPPORTED_ARGUMENT_TYPES.joinToString { it.klass.simpleName }}")
?: throw IllegalArgumentException(
"Unsupported argument type: ${arg::class.java}, should be one of: " +
SUPPORTED_ARGUMENT_TYPES.joinToString { it.klass.simpleName }
)
}
// convert arguments that can be converted into plain text
@@ -128,14 +132,15 @@ fun <TElement : KtElement> createByPattern(
val args = args.zip(argumentTypes).map {
val (arg, type) = it
if (type is PlainTextArgumentType)
(type.toPlainText as Function1<Any, String>).invoke(arg) // TODO: see KT-7833
@Suppress("UNCHECKED_CAST") // Suppress compiler checks as types checks were done in runtime
(type.toPlainText as Function1<Any, String>).invoke(arg)
else
arg
}
val (processedText, allPlaceholders) = processPattern(pattern, args)
var resultElement = factory(processedText.trim())
var resultElement: KtElement = factory(processedText.trim())
val project = resultElement.project
val start = resultElement.startOffset
@@ -156,7 +161,7 @@ fun <TElement : KtElement> createByPattern(
val elementRange = element.textRange.shiftRight(-start)
if (elementRange == range && expectedElementType.isInstance(element)) {
val pointer = pointerManager.createSmartPsiElementPointer(element)
pointers.put(pointer, n)
pointers[pointer] = n
break
}
@@ -170,7 +175,7 @@ fun <TElement : KtElement> createByPattern(
val codeStyleManager = CodeStyleManager.getInstance(project)
if (reformat) {
if (CREATEBYPATTERN_MAY_NOT_REFORMAT) {
if (CREATE_BY_PATTERN_MAY_NOT_REFORMAT) {
throw java.lang.IllegalArgumentException("Reformatting is not allowed in the current context; please change the invocation to use reformat=false")
}
val stringPlaceholderRanges = allPlaceholders
@@ -182,15 +187,15 @@ fun <TElement : KtElement> createByPattern(
// reformat whole text except for String arguments (as they can contain user's formatting to be preserved)
resultElement = if (stringPlaceholderRanges.none()) {
codeStyleManager.reformat(resultElement, true) as TElement
codeStyleManager.reformat(resultElement, true) as KtElement
} else {
var bound = resultElement.endOffset - 1
for (range in stringPlaceholderRanges) {
// we extend reformatting range by 1 to the right because otherwise some of spaces are not reformatted
resultElement = codeStyleManager.reformatRange(resultElement, range.endOffset + start, bound + 1, true) as TElement
resultElement = codeStyleManager.reformatRange(resultElement, range.endOffset + start, bound + 1, true) as KtElement
bound = range.startOffset + start
}
codeStyleManager.reformatRange(resultElement, start, bound + 1, true) as TElement
codeStyleManager.reformatRange(resultElement, start, bound + 1, true) as KtElement
}
// do not reformat the whole expression in PostprocessReformattingAspect
@@ -207,14 +212,15 @@ fun <TElement : KtElement> createByPattern(
if (element == resultElement) {
assert(range.first == range.last)
resultElement = range.first as TElement
resultElement = range.first as KtElement
}
}
if (reformat)
codeStyleManager.adjustLineIndent(resultElement.containingFile, resultElement.textRange)
return resultElement
@Suppress("UNCHECKED_CAST")
return resultElement as TElement
}
private data class Placeholder(val range: TextRange, val text: String)
@@ -244,7 +250,7 @@ private fun processPattern(pattern: String, args: List<Any>): PatternData {
} else {
check(nextChar?.isDigit() ?: false, "unclosed '$'")
val lastIndex = (i..pattern.length - 1).firstOrNull { !pattern[it].isDigit() } ?: pattern.length
val lastIndex = (i until pattern.length).firstOrNull { !pattern[it].isDigit() } ?: pattern.length
val n = pattern.substring(i, lastIndex).toInt()
check(n >= 0, "invalid placeholder number: $n")
i = lastIndex
@@ -265,7 +271,7 @@ private fun processPattern(pattern: String, args: List<Any>): PatternData {
append(placeholderText)
val range = TextRange(length - placeholderText.length, length)
ranges.getOrPut(n, { ArrayList() }).add(Placeholder(range, placeholderText))
ranges.getOrPut(n) { ArrayList() }.add(Placeholder(range, placeholderText))
continue
}
} else {
@@ -28,7 +28,7 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection
import org.jetbrains.kotlin.psi.CREATEBYPATTERN_MAY_NOT_REFORMAT
import org.jetbrains.kotlin.psi.CREATE_BY_PATTERN_MAY_NOT_REFORMAT
import org.jetbrains.kotlin.psi.KtBlockExpression
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.psiUtil.containsInside
@@ -86,13 +86,13 @@ abstract class SelfTargetingIntention<TElement : PsiElement>(
final override fun isAvailable(project: Project, editor: Editor, file: PsiFile): Boolean {
if (ApplicationManager.getApplication().isUnitTestMode) {
CREATEBYPATTERN_MAY_NOT_REFORMAT = true
CREATE_BY_PATTERN_MAY_NOT_REFORMAT = true
}
try {
return getTarget(editor, file) != null
}
finally {
CREATEBYPATTERN_MAY_NOT_REFORMAT = false
CREATE_BY_PATTERN_MAY_NOT_REFORMAT = false
}
}
@@ -22,7 +22,7 @@ import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.psi.CREATEBYPATTERN_MAY_NOT_REFORMAT
import org.jetbrains.kotlin.psi.CREATE_BY_PATTERN_MAY_NOT_REFORMAT
import org.jetbrains.kotlin.psi.KtCodeFragment
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer
@@ -39,7 +39,7 @@ abstract class QuickFixActionBase<out T : PsiElement>(element: T) : IntentionAct
final override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean {
if (ApplicationManager.getApplication().isUnitTestMode) {
CREATEBYPATTERN_MAY_NOT_REFORMAT = true
CREATE_BY_PATTERN_MAY_NOT_REFORMAT = true
}
try {
val element = element ?: return false
@@ -50,7 +50,7 @@ abstract class QuickFixActionBase<out T : PsiElement>(element: T) : IntentionAct
isAvailableImpl(project, editor, file)
}
finally {
CREATEBYPATTERN_MAY_NOT_REFORMAT = false
CREATE_BY_PATTERN_MAY_NOT_REFORMAT = false
}
}