i18n: KtPsiFactory: add @NonNls to parameters

This commit is contained in:
Dmitry Gridin
2020-03-04 12:47:34 +07:00
parent 07861fdc6f
commit 2b8373447a
@@ -30,7 +30,7 @@ fun KtPsiFactory(project: Project?, markGenerated: Boolean = true): KtPsiFactory
fun KtPsiFactory(elementForProject: PsiElement, markGenerated: Boolean = true): KtPsiFactory = fun KtPsiFactory(elementForProject: PsiElement, markGenerated: Boolean = true): KtPsiFactory =
KtPsiFactory(elementForProject.project, markGenerated) KtPsiFactory(elementForProject.project, markGenerated)
private val DO_NOT_ANALYZE_NOTIFICATION = "This file was created by KtPsiFactory and should not be analyzed\n" + private const val DO_NOT_ANALYZE_NOTIFICATION = "This file was created by KtPsiFactory and should not be analyzed\n" +
"Use createAnalyzableFile to create file that can be analyzed\n" "Use createAnalyzableFile to create file that can be analyzed\n"
var KtFile.doNotAnalyze: String? by UserDataProperty(Key.create("DO_NOT_ANALYZE")) var KtFile.doNotAnalyze: String? by UserDataProperty(Key.create("DO_NOT_ANALYZE"))
@@ -54,7 +54,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return property.valOrVarKeyword return property.valOrVarKeyword
} }
private fun doCreateExpression(text: String): KtExpression? { private fun doCreateExpression(@NonNls text: String): KtExpression? {
//NOTE: '\n' below is important - some strange code indenting problems appear without it //NOTE: '\n' below is important - some strange code indenting problems appear without it
return createProperty("val x =\n$text").initializer return createProperty("val x =\n$text").initializer
} }
@@ -67,7 +67,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return expression return expression
} }
fun createExpressionIfPossible(text: String): KtExpression? { fun createExpressionIfPossible(@NonNls text: String): KtExpression? {
val expression = doCreateExpression(text) ?: return null val expression = doCreateExpression(text) ?: return null
return if (expression.text == text) expression else null return if (expression.text == text) expression else null
} }
@@ -75,22 +75,22 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
fun createThisExpression() = fun createThisExpression() =
(createExpression("this.x") as KtQualifiedExpression).receiverExpression as KtThisExpression (createExpression("this.x") as KtQualifiedExpression).receiverExpression as KtThisExpression
fun createThisExpression(qualifier: String) = fun createThisExpression(@NonNls qualifier: String) =
(createExpression("this@$qualifier.x") as KtQualifiedExpression).receiverExpression as KtThisExpression (createExpression("this@$qualifier.x") as KtQualifiedExpression).receiverExpression as KtThisExpression
fun createCallArguments(text: String): KtValueArgumentList { fun createCallArguments(@NonNls text: String): KtValueArgumentList {
val property = createProperty("val x = foo $text") val property = createProperty("val x = foo $text")
return (property.initializer as KtCallExpression).valueArgumentList!! return (property.initializer as KtCallExpression).valueArgumentList!!
} }
fun createTypeArguments(text: String): KtTypeArgumentList { fun createTypeArguments(@NonNls text: String): KtTypeArgumentList {
val property = createProperty("val x = foo$text()") val property = createProperty("val x = foo$text()")
return (property.initializer as KtCallExpression).typeArgumentList!! return (property.initializer as KtCallExpression).typeArgumentList!!
} }
fun createTypeArgument(text: String) = createTypeArguments("<$text>").arguments.first() fun createTypeArgument(@NonNls text: String) = createTypeArguments("<$text>").arguments.first()
fun createType(type: String): KtTypeReference { fun createType(@NonNls type: String): KtTypeReference {
val typeReference = createTypeIfPossible(type) val typeReference = createTypeIfPossible(type)
if (typeReference == null || typeReference.text != type) { if (typeReference == null || typeReference.text != type) {
throw IllegalArgumentException("Incorrect type: $type") throw IllegalArgumentException("Incorrect type: $type")
@@ -100,7 +100,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
fun createType(typeElement: KtTypeElement) = createType("X").apply { this.typeElement!!.replace(typeElement) } fun createType(typeElement: KtTypeElement) = createType("X").apply { this.typeElement!!.replace(typeElement) }
fun createTypeIfPossible(type: String): KtTypeReference? { fun createTypeIfPossible(@NonNls type: String): KtTypeReference? {
val typeReference = createProperty("val x : $type").typeReference val typeReference = createProperty("val x : $type").typeReference
return if (typeReference?.text == type) typeReference else null return if (typeReference?.text == type) typeReference else null
} }
@@ -114,11 +114,11 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
.apply { this.typeReference!!.replace(typeReference) } .apply { this.typeReference!!.replace(typeReference) }
} }
fun createTypeAlias(name: String, typeParameters: List<String>, typeElement: KtTypeElement): KtTypeAlias { fun createTypeAlias(@NonNls name: String, typeParameters: List<String>, typeElement: KtTypeElement): KtTypeAlias {
return createTypeAlias(name, typeParameters, "X").apply { getTypeReference()!!.replace(createType(typeElement)) } return createTypeAlias(name, typeParameters, "X").apply { getTypeReference()!!.replace(createType(typeElement)) }
} }
fun createTypeAlias(name: String, typeParameters: List<String>, body: String): KtTypeAlias { fun createTypeAlias(@NonNls name: String, typeParameters: List<String>, @NonNls body: String): KtTypeAlias {
val typeParametersText = if (typeParameters.isNotEmpty()) typeParameters.joinToString(prefix = "<", postfix = ">") else "" val typeParametersText = if (typeParameters.isNotEmpty()) typeParameters.joinToString(prefix = "<", postfix = ">") else ""
return createDeclaration("typealias $name$typeParametersText = $body") return createDeclaration("typealias $name$typeParametersText = $body")
} }
@@ -157,7 +157,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return createWhiteSpace(" ") return createWhiteSpace(" ")
} }
fun createWhiteSpace(text: String): PsiElement { fun createWhiteSpace(@NonNls text: String): PsiElement {
return createProperty("val${text}x: Int").findElementAt(3)!! return createProperty("val${text}x: Int").findElementAt(3)!!
} }
@@ -174,7 +174,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return createDeclaration(text) return createDeclaration(text)
} }
fun createObject(text: String): KtObjectDeclaration { fun createObject(@NonNls text: String): KtObjectDeclaration {
return createDeclaration(text) return createDeclaration(text)
} }
@@ -182,23 +182,23 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return createCompanionObject("companion object {\n}") return createCompanionObject("companion object {\n}")
} }
fun createCompanionObject(text: String): KtObjectDeclaration { fun createCompanionObject(@NonNls text: String): KtObjectDeclaration {
return createClass("class A {\n $text\n}").companionObjects.first() return createClass("class A {\n $text\n}").companionObjects.first()
} }
fun createFileAnnotation(annotationText: String): KtAnnotationEntry { fun createFileAnnotation(@NonNls annotationText: String): KtAnnotationEntry {
return createFileAnnotationListWithAnnotation(annotationText).annotationEntries.first() return createFileAnnotationListWithAnnotation(annotationText).annotationEntries.first()
} }
fun createFileAnnotationListWithAnnotation(annotationText: String): KtFileAnnotationList { fun createFileAnnotationListWithAnnotation(@NonNls annotationText: String): KtFileAnnotationList {
return createFile("@file:$annotationText").fileAnnotationList!! return createFile("@file:$annotationText").fileAnnotationList!!
} }
fun createFile(text: String): KtFile { fun createFile(@NonNls text: String): KtFile {
return createFile("dummy.kt", text) return createFile("dummy.kt", text)
} }
private fun doCreateFile(fileName: String, text: String): KtFile { private fun doCreateFile(@NonNls fileName: String, @NonNls text: String): KtFile {
return PsiFileFactory.getInstance(project).createFileFromText( return PsiFileFactory.getInstance(project).createFileFromText(
fileName, fileName,
KotlinFileType.INSTANCE, KotlinFileType.INSTANCE,
@@ -209,7 +209,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
) as KtFile ) as KtFile
} }
fun createFile(fileName: String, text: String): KtFile { fun createFile(@NonNls fileName: String, @NonNls text: String): KtFile {
val file = doCreateFile(fileName, text) val file = doCreateFile(fileName, text)
file.doNotAnalyze = DO_NOT_ANALYZE_NOTIFICATION file.doNotAnalyze = DO_NOT_ANALYZE_NOTIFICATION
@@ -217,19 +217,19 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return file return file
} }
fun createAnalyzableFile(fileName: String, text: String, contextToAnalyzeIn: PsiElement): KtFile { fun createAnalyzableFile(@NonNls fileName: String, @NonNls text: String, contextToAnalyzeIn: PsiElement): KtFile {
val file = doCreateFile(fileName, text) val file = doCreateFile(fileName, text)
file.analysisContext = contextToAnalyzeIn file.analysisContext = contextToAnalyzeIn
return file return file
} }
fun createFileWithLightClassSupport(fileName: String, text: String, contextToAnalyzeIn: PsiElement): KtFile { fun createFileWithLightClassSupport(@NonNls fileName: String, @NonNls text: String, contextToAnalyzeIn: PsiElement): KtFile {
val file = createPhysicalFile(fileName, text) val file = createPhysicalFile(fileName, text)
file.analysisContext = contextToAnalyzeIn file.analysisContext = contextToAnalyzeIn
return file return file
} }
fun createPhysicalFile(fileName: String, text: String): KtFile { fun createPhysicalFile(@NonNls fileName: String, @NonNls text: String): KtFile {
return PsiFileFactory.getInstance(project).createFileFromText( return PsiFileFactory.getInstance(project).createFileFromText(
fileName, fileName,
KotlinFileType.INSTANCE, KotlinFileType.INSTANCE,
@@ -239,18 +239,24 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
) as KtFile ) as KtFile
} }
fun createProperty(modifiers: String?, name: String, type: String?, isVar: Boolean, initializer: String?): KtProperty { fun createProperty(
@NonNls modifiers: String?,
@NonNls name: String,
@NonNls type: String?,
isVar: Boolean,
@NonNls initializer: String?
): KtProperty {
val text = modifiers.let { "$it " } + val text = modifiers.let { "$it " } +
(if (isVar) " var " else " val ") + name + (if (isVar) " var " else " val ") + name +
(if (type != null) ":" + type else "") + (if (initializer == null) "" else " = " + initializer) (if (type != null) ":$type" else "") + (if (initializer == null) "" else " = $initializer")
return createProperty(text) return createProperty(text)
} }
fun createProperty(name: String, type: String?, isVar: Boolean, initializer: String?): KtProperty { fun createProperty(@NonNls name: String, @NonNls type: String?, isVar: Boolean, @NonNls initializer: String?): KtProperty {
return createProperty(null, name, type, isVar, initializer) return createProperty(null, name, type, isVar, initializer)
} }
fun createProperty(name: String, type: String?, isVar: Boolean): KtProperty { fun createProperty(@NonNls name: String, @NonNls type: String?, isVar: Boolean): KtProperty {
return createProperty(name, type, isVar, null) return createProperty(name, type, isVar, null)
} }
@@ -290,11 +296,11 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return delegate return delegate
} }
fun createDestructuringDeclaration(text: String): KtDestructuringDeclaration { fun createDestructuringDeclaration(@NonNls text: String): KtDestructuringDeclaration {
return createFunction("fun foo() {$text}").bodyBlockExpression!!.statements.first() as KtDestructuringDeclaration return createFunction("fun foo() {$text}").bodyBlockExpression!!.statements.first() as KtDestructuringDeclaration
} }
fun createDestructuringParameter(text: String): KtParameter { fun createDestructuringParameter(@NonNls text: String): KtParameter {
val dummyFun = createFunction("fun foo() = { $text -> }") val dummyFun = createFunction("fun foo() = { $text -> }")
return (dummyFun.bodyExpression as KtLambdaExpression).functionLiteral.valueParameters.first() return (dummyFun.bodyExpression as KtLambdaExpression).functionLiteral.valueParameters.first()
} }
@@ -312,19 +318,19 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return declarations.first() as TDeclaration return declarations.first() as TDeclaration
} }
fun createNameIdentifier(name: String) = createNameIdentifierIfPossible(name)!! fun createNameIdentifier(@NonNls name: String) = createNameIdentifierIfPossible(name)!!
fun createNameIdentifierIfPossible(name: String) = createProperty(name, null, false).nameIdentifier fun createNameIdentifierIfPossible(@NonNls name: String) = createProperty(name, null, false).nameIdentifier
fun createSimpleName(name: String): KtSimpleNameExpression { fun createSimpleName(@NonNls name: String): KtSimpleNameExpression {
return createProperty(name, null, false, name).initializer as KtSimpleNameExpression return createProperty(name, null, false, name).initializer as KtSimpleNameExpression
} }
fun createOperationName(name: String): KtSimpleNameExpression { fun createOperationName(@NonNls name: String): KtSimpleNameExpression {
return (createExpression("0 $name 0") as KtBinaryExpression).operationReference return (createExpression("0 $name 0") as KtBinaryExpression).operationReference
} }
fun createIdentifier(name: String): PsiElement { fun createIdentifier(@NonNls name: String): PsiElement {
return createSimpleName(name).getIdentifier()!! return createSimpleName(name).getIdentifier()!!
} }
@@ -332,9 +338,9 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return createDeclaration(funDecl) return createDeclaration(funDecl)
} }
fun createCallableReferenceExpression(text: String) = createExpression(text) as? KtCallableReferenceExpression fun createCallableReferenceExpression(@NonNls text: String) = createExpression(text) as? KtCallableReferenceExpression
fun createSecondaryConstructor(decl: String): KtSecondaryConstructor { fun createSecondaryConstructor(@NonNls decl: String): KtSecondaryConstructor {
return createClass("class Foo {\n $decl \n}").secondaryConstructors.first() return createClass("class Foo {\n $decl \n}").secondaryConstructors.first()
} }
@@ -342,8 +348,8 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return createModifierList(modifier.value) return createModifierList(modifier.value)
} }
fun createModifierList(text: String): KtModifierList { fun createModifierList(@NonNls text: String): KtModifierList {
return createProperty(text + " val x").modifierList!! return createProperty("$text val x").modifierList!!
} }
fun createEmptyModifierList() = createModifierList(KtTokens.PRIVATE_KEYWORD).apply { firstChild.delete() } fun createEmptyModifierList() = createModifierList(KtTokens.PRIVATE_KEYWORD).apply { firstChild.delete() }
@@ -352,7 +358,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return createModifierList(modifier.value).getModifier(modifier)!! return createModifierList(modifier.value).getModifier(modifier)!!
} }
fun createAnnotationEntry(text: String): KtAnnotationEntry { fun createAnnotationEntry(@NonNls text: String): KtAnnotationEntry {
val modifierList = createProperty(text + " val x").modifierList val modifierList = createProperty(text + " val x").modifierList
return modifierList!!.annotationEntries.first() return modifierList!!.annotationEntries.first()
} }
@@ -369,33 +375,33 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return createClass("class A(){}").getBody()!! return createClass("class A(){}").getBody()!!
} }
fun createParameter(text: String): KtParameter { fun createParameter(@NonNls text: String): KtParameter {
return createClass("class A($text)").primaryConstructorParameters.first() return createClass("class A($text)").primaryConstructorParameters.first()
} }
fun createLoopParameter(text: String): KtParameter { fun createLoopParameter(@NonNls text: String): KtParameter {
return (createExpression("for ($text in list) {}") as KtForExpression).loopParameter!! return (createExpression("for ($text in list) {}") as KtForExpression).loopParameter!!
} }
fun createParameterList(text: String): KtParameterList { fun createParameterList(@NonNls text: String): KtParameterList {
return createFunction("fun foo$text{}").valueParameterList!! return createFunction("fun foo$text{}").valueParameterList!!
} }
fun createTypeParameterList(text: String) = createClass("class Foo$text").typeParameterList!! fun createTypeParameterList(@NonNls text: String) = createClass("class Foo$text").typeParameterList!!
fun createTypeParameter(text: String) = createTypeParameterList("<$text>").parameters.first()!! fun createTypeParameter(@NonNls text: String) = createTypeParameterList("<$text>").parameters.first()!!
fun createLambdaParameterListIfAny(text: String) = fun createLambdaParameterListIfAny(@NonNls text: String) =
createLambdaExpression(text, "0").functionLiteral.valueParameterList createLambdaExpression(text, "0").functionLiteral.valueParameterList
fun createLambdaParameterList(text: String) = createLambdaParameterListIfAny(text)!! fun createLambdaParameterList(@NonNls text: String) = createLambdaParameterListIfAny(text)!!
fun createLambdaExpression(parameters: String, body: String): KtLambdaExpression = fun createLambdaExpression(@NonNls parameters: String, @NonNls body: String): KtLambdaExpression =
(if (parameters.isNotEmpty()) createExpression("{ $parameters -> $body }") (if (parameters.isNotEmpty()) createExpression("{ $parameters -> $body }")
else createExpression("{ $body }")) as KtLambdaExpression else createExpression("{ $body }")) as KtLambdaExpression
fun createEnumEntry(text: String): KtEnumEntry { fun createEnumEntry(@NonNls text: String): KtEnumEntry {
return createDeclaration<KtClass>("enum class E {$text}").declarations[0] as KtEnumEntry return createDeclaration<KtClass>("enum class E {$text}").declarations[0] as KtEnumEntry
} }
@@ -403,7 +409,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return createEnumEntry("Entry()").initializerList!! return createEnumEntry("Entry()").initializerList!!
} }
fun createWhenEntry(entryText: String): KtWhenEntry { fun createWhenEntry(@NonNls entryText: String): KtWhenEntry {
val function = createFunction("fun foo() { when(12) { $entryText } }") val function = createFunction("fun foo() { when(12) { $entryText } }")
val whenEntry = PsiTreeUtil.findChildOfType(function, KtWhenEntry::class.java) val whenEntry = PsiTreeUtil.findChildOfType(function, KtWhenEntry::class.java)
@@ -413,7 +419,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return whenEntry return whenEntry
} }
fun createWhenCondition(conditionText: String): KtWhenCondition { fun createWhenCondition(@NonNls conditionText: String): KtWhenCondition {
val whenEntry = createWhenEntry("$conditionText -> {}") val whenEntry = createWhenEntry("$conditionText -> {}")
return whenEntry.conditions[0] return whenEntry.conditions[0]
} }
@@ -424,17 +430,17 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return stringTemplateExpression.entries[0] as KtStringTemplateEntryWithExpression return stringTemplateExpression.entries[0] as KtStringTemplateEntryWithExpression
} }
fun createSimpleNameStringTemplateEntry(name: String): KtSimpleNameStringTemplateEntry { fun createSimpleNameStringTemplateEntry(@NonNls name: String): KtSimpleNameStringTemplateEntry {
val stringTemplateExpression = createExpression("\"\$$name\"") as KtStringTemplateExpression val stringTemplateExpression = createExpression("\"\$$name\"") as KtStringTemplateExpression
return stringTemplateExpression.entries[0] as KtSimpleNameStringTemplateEntry return stringTemplateExpression.entries[0] as KtSimpleNameStringTemplateEntry
} }
fun createLiteralStringTemplateEntry(literal: String): KtLiteralStringTemplateEntry { fun createLiteralStringTemplateEntry(@NonNls literal: String): KtLiteralStringTemplateEntry {
val stringTemplateExpression = createExpression("\"$literal\"") as KtStringTemplateExpression val stringTemplateExpression = createExpression("\"$literal\"") as KtStringTemplateExpression
return stringTemplateExpression.entries[0] as KtLiteralStringTemplateEntry return stringTemplateExpression.entries[0] as KtLiteralStringTemplateEntry
} }
fun createStringTemplate(content: String) = createExpression("\"$content\"") as KtStringTemplateExpression fun createStringTemplate(@NonNls content: String) = createExpression("\"$content\"") as KtStringTemplateExpression
fun createPackageDirective(fqName: FqName): KtPackageDirective { fun createPackageDirective(fqName: FqName): KtPackageDirective {
return createFile("package ${fqName.asString()}").packageDirective!! return createFile("package ${fqName.asString()}").packageDirective!!
@@ -482,28 +488,28 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
fun createClassKeyword(): PsiElement = createClass("class A").getClassKeyword()!! fun createClassKeyword(): PsiElement = createClass("class A").getClassKeyword()!!
fun createPrimaryConstructor(text: String = ""): KtPrimaryConstructor { fun createPrimaryConstructor(@NonNls text: String = ""): KtPrimaryConstructor {
return createClass(if (text.isNotEmpty()) "class A $text" else "class A()").primaryConstructor!! return createClass(if (text.isNotEmpty()) "class A $text" else "class A()").primaryConstructor!!
} }
fun createPrimaryConstructorWithModifiers(modifiers: String?): KtPrimaryConstructor { fun createPrimaryConstructorWithModifiers(@NonNls modifiers: String?): KtPrimaryConstructor {
return modifiers?.let { createPrimaryConstructor("$it constructor()") } ?: createPrimaryConstructor() return modifiers?.let { createPrimaryConstructor("$it constructor()") } ?: createPrimaryConstructor()
} }
fun createConstructorKeyword(): PsiElement = fun createConstructorKeyword(): PsiElement =
createClass("class A constructor()").primaryConstructor!!.getConstructorKeyword()!! createClass("class A constructor()").primaryConstructor!!.getConstructorKeyword()!!
fun createLabeledExpression(labelName: String): KtLabeledExpression = createExpression("$labelName@ 1") as KtLabeledExpression fun createLabeledExpression(@NonNls labelName: String): KtLabeledExpression = createExpression("$labelName@ 1") as KtLabeledExpression
fun createTypeCodeFragment(text: String, context: PsiElement?): KtTypeCodeFragment { fun createTypeCodeFragment(@NonNls text: String, context: PsiElement?): KtTypeCodeFragment {
return KtTypeCodeFragment(project, "fragment.kt", text, context) return KtTypeCodeFragment(project, "fragment.kt", text, context)
} }
fun createExpressionCodeFragment(text: String, context: PsiElement?): KtExpressionCodeFragment { fun createExpressionCodeFragment(@NonNls text: String, context: PsiElement?): KtExpressionCodeFragment {
return KtExpressionCodeFragment(project, "fragment.kt", text, null, context) return KtExpressionCodeFragment(project, "fragment.kt", text, null, context)
} }
fun createBlockCodeFragment(text: String, context: PsiElement?): KtBlockCodeFragment { fun createBlockCodeFragment(@NonNls text: String, context: PsiElement?): KtBlockCodeFragment {
return KtBlockCodeFragment(project, "fragment.kt", text, null, context) return KtBlockCodeFragment(project, "fragment.kt", text, null, context)
} }
@@ -540,17 +546,17 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return argumentList.arguments.single() return argumentList.arguments.single()
} }
fun createArgument(text: String) = createCallArguments("($text)").arguments.first()!! fun createArgument(@NonNls text: String) = createCallArguments("($text)").arguments.first()!!
fun createSuperTypeCallEntry(text: String): KtSuperTypeCallEntry { fun createSuperTypeCallEntry(@NonNls text: String): KtSuperTypeCallEntry {
return createClass("class A: $text").superTypeListEntries.first() as KtSuperTypeCallEntry return createClass("class A: $text").superTypeListEntries.first() as KtSuperTypeCallEntry
} }
fun createSuperTypeEntry(text: String): KtSuperTypeEntry { fun createSuperTypeEntry(@NonNls text: String): KtSuperTypeEntry {
return createClass("class A: $text").superTypeListEntries.first() as KtSuperTypeEntry return createClass("class A: $text").superTypeListEntries.first() as KtSuperTypeEntry
} }
fun creareDelegatedSuperTypeEntry(text: String): KtConstructorDelegationCall { fun creareDelegatedSuperTypeEntry(@NonNls text: String): KtConstructorDelegationCall {
val colonOrEmpty = if (text.isEmpty()) "" else ": " val colonOrEmpty = if (text.isEmpty()) "" else ": "
return createClass("class A { constructor()$colonOrEmpty$text {}").secondaryConstructors.first().getDelegationCall() return createClass("class A { constructor()$colonOrEmpty$text {}").secondaryConstructors.first().getDelegationCall()
} }
@@ -569,7 +575,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
private val sb = StringBuilder() private val sb = StringBuilder()
private var state = State.MODIFIERS private var state = State.MODIFIERS
fun modifier(modifier: String): ClassHeaderBuilder { fun modifier(@NonNls modifier: String): ClassHeaderBuilder {
assert(state == State.MODIFIERS) assert(state == State.MODIFIERS)
sb.append(modifier) sb.append(modifier)
@@ -589,7 +595,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
} }
fun name(name: String): ClassHeaderBuilder { fun name(@NonNls name: String): ClassHeaderBuilder {
placeKeyword() placeKeyword()
sb.append(name) sb.append(name)
@@ -613,7 +619,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return this return this
} }
fun baseClass(name: String, typeArguments: Collection<String>, isInterface: Boolean): ClassHeaderBuilder { fun baseClass(@NonNls name: String, typeArguments: Collection<String>, isInterface: Boolean): ClassHeaderBuilder {
assert(state == State.BASE_CLASS) assert(state == State.BASE_CLASS)
sb.append(" : $name") sb.append(" : $name")
@@ -722,7 +728,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return this return this
} }
fun receiver(receiverType: String): CallableBuilder { fun receiver(@NonNls receiverType: String): CallableBuilder {
assert(state == State.RECEIVER) assert(state == State.RECEIVER)
sb.append(receiverType).append(".") sb.append(receiverType).append(".")
@@ -731,7 +737,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return this return this
} }
fun name(name: String = CONSTRUCTOR_NAME): CallableBuilder { fun name(@NonNls name: String = CONSTRUCTOR_NAME): CallableBuilder {
assert(state == State.NAME || state == State.RECEIVER) assert(state == State.NAME || state == State.RECEIVER)
assert(name != CONSTRUCTOR_NAME || target == Target.CONSTRUCTOR) assert(name != CONSTRUCTOR_NAME || target == Target.CONSTRUCTOR)
@@ -748,7 +754,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return this return this
} }
fun param(name: String, type: String, defaultValue: String? = null): CallableBuilder { fun param(@NonNls name: String, @NonNls type: String, @NonNls defaultValue: String? = null): CallableBuilder {
assert(target == Target.FUNCTION || target == Target.CONSTRUCTOR) assert(target == Target.FUNCTION || target == Target.CONSTRUCTOR)
assert(state == State.FIRST_PARAM || state == State.REST_PARAMS) assert(state == State.FIRST_PARAM || state == State.REST_PARAMS)
@@ -766,7 +772,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return this return this
} }
fun returnType(type: String): CallableBuilder { fun returnType(@NonNls type: String): CallableBuilder {
closeParams() closeParams()
sb.append(": ").append(type) sb.append(": ").append(type)
@@ -790,7 +796,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return this return this
} }
fun superDelegation(argumentList: String): CallableBuilder { fun superDelegation(@NonNls argumentList: String): CallableBuilder {
assert(state == State.TYPE_CONSTRAINTS && target == Target.CONSTRUCTOR) assert(state == State.TYPE_CONSTRAINTS && target == Target.CONSTRUCTOR)
sb.append(": super").append(argumentList) sb.append(": super").append(argumentList)
@@ -799,7 +805,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return this return this
} }
fun blockBody(body: String): CallableBuilder { fun blockBody(@NonNls body: String): CallableBuilder {
assert(state == State.BODY || state == State.TYPE_CONSTRAINTS) assert(state == State.BODY || state == State.TYPE_CONSTRAINTS)
sb.append(bodyPrefix()).append(" {\n").append(body).append("\n}") sb.append(bodyPrefix()).append(" {\n").append(body).append("\n}")
@@ -808,7 +814,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return this return this
} }
fun getterExpression(expression: String, breakLine: Boolean = true): CallableBuilder { fun getterExpression(@NonNls expression: String, breakLine: Boolean = true): CallableBuilder {
assert(target == Target.READ_ONLY_PROPERTY) assert(target == Target.READ_ONLY_PROPERTY)
assert(state == State.BODY || state == State.TYPE_CONSTRAINTS) assert(state == State.BODY || state == State.TYPE_CONSTRAINTS)
@@ -818,7 +824,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return this return this
} }
fun initializer(body: String): CallableBuilder { fun initializer(@NonNls body: String): CallableBuilder {
assert(target == Target.READ_ONLY_PROPERTY && (state == State.BODY || state == State.TYPE_CONSTRAINTS)) assert(target == Target.READ_ONLY_PROPERTY && (state == State.BODY || state == State.TYPE_CONSTRAINTS))
sb.append(" = ").append(body) sb.append(" = ").append(body)
@@ -827,7 +833,7 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
return this return this
} }
fun lazyBody(body: String): CallableBuilder { fun lazyBody(@NonNls body: String): CallableBuilder {
assert(target == Target.READ_ONLY_PROPERTY && (state == State.BODY || state == State.TYPE_CONSTRAINTS)) assert(target == Target.READ_ONLY_PROPERTY && (state == State.BODY || state == State.TYPE_CONSTRAINTS))
sb.append(" by kotlin.lazy {\n").append(body).append("\n}") sb.append(" by kotlin.lazy {\n").append(body).append("\n}")
@@ -847,17 +853,21 @@ class KtPsiFactory @JvmOverloads constructor(private val project: Project, val m
} }
} }
fun createBlock(bodyText: String): KtBlockExpression { fun createBlock(@NonNls bodyText: String): KtBlockExpression {
return createFunction("fun foo() {\n$bodyText\n}").bodyBlockExpression!! return createFunction("fun foo() {\n$bodyText\n}").bodyBlockExpression!!
} }
fun createSingleStatementBlock(statement: KtExpression, prevComment: String? = null, nextComment: String? = null): KtBlockExpression { fun createSingleStatementBlock(
statement: KtExpression,
@NonNls prevComment: String? = null,
@NonNls nextComment: String? = null
): KtBlockExpression {
val prev = if (prevComment == null) "" else " $prevComment " val prev = if (prevComment == null) "" else " $prevComment "
val next = if (nextComment == null) "" else " $nextComment " val next = if (nextComment == null) "" else " $nextComment "
return createDeclarationByPattern<KtNamedFunction>("fun foo() {\n$prev$0$next\n}", statement).bodyBlockExpression!! return createDeclarationByPattern<KtNamedFunction>("fun foo() {\n$prev$0$next\n}", statement).bodyBlockExpression!!
} }
fun createComment(text: String): PsiComment { fun createComment(@NonNls text: String): PsiComment {
val file = createFile(text) val file = createFile(text)
val comments = file.children.filterIsInstance<PsiComment>() val comments = file.children.filterIsInstance<PsiComment>()
val comment = comments.single() val comment = comments.single()