diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetDeclarationImpl.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetDeclarationImpl.java index b0fb2f3b266..fb7587a6cc1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetDeclarationImpl.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetDeclarationImpl.java @@ -56,6 +56,12 @@ abstract class JetDeclarationImpl extends JetExpressionImpl implements JetDeclar AddRemoveModifierPackage.removeModifier(this, modifier); } + @NotNull + @Override + public JetAnnotationEntry addAnnotationEntry(@NotNull JetAnnotationEntry annotationEntry) { + return AddRemoveModifierPackage.addAnnotationEntry(this, annotationEntry); + } + @NotNull @Override public List getAnnotationEntries() { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetModifierListOwner.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetModifierListOwner.java index e585a680624..66b73f0df43 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetModifierListOwner.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetModifierListOwner.java @@ -29,4 +29,7 @@ public interface JetModifierListOwner extends PsiElement, JetAnnotated { void addModifier(@NotNull JetModifierKeywordToken modifier); void removeModifier(@NotNull JetModifierKeywordToken modifier); + + @NotNull + JetAnnotationEntry addAnnotationEntry(@NotNull JetAnnotationEntry annotationEntry); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetModifierListOwnerStub.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetModifierListOwnerStub.java index ce47f39dba0..01206a716ec 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetModifierListOwnerStub.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetModifierListOwnerStub.java @@ -60,6 +60,12 @@ public class JetModifierListOwnerStub> extends JetEleme AddRemoveModifierPackage.removeModifier(this, modifier); } + @NotNull + @Override + public JetAnnotationEntry addAnnotationEntry(@NotNull JetAnnotationEntry annotationEntry) { + return AddRemoveModifierPackage.addAnnotationEntry(this, annotationEntry); + } + @Override @NotNull public List getAnnotationEntries() { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPrimaryConstructor.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPrimaryConstructor.kt index f256c1674d8..1194566bc4b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPrimaryConstructor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPrimaryConstructor.kt @@ -43,4 +43,16 @@ public class JetPrimaryConstructor : JetConstructor { addBefore(newModifierList, parameterList) } } + + override fun addAnnotationEntry(annotationEntry: JetAnnotationEntry): JetAnnotationEntry { + val modifierList = getModifierList() + return if (modifierList != null) { + modifierList.addBefore(annotationEntry, modifierList.firstChild) as JetAnnotationEntry + } + else { + val parameterList = getValueParameterList()!! + val newModifierList = JetPsiFactory(getProject()).createModifierList(annotationEntry.text) + (addBefore(newModifierList, parameterList) as JetModifierList).annotationEntries.first() + } + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/addRemoveModifier.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/addRemoveModifier.kt index 67ee4302bc7..8cec1539d33 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/addRemoveModifier.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/addRemoveModifier.kt @@ -16,33 +16,44 @@ package org.jetbrains.kotlin.psi.addRemoveModifier +import com.intellij.psi.PsiComment +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiWhiteSpace import org.jetbrains.kotlin.lexer.JetModifierKeywordToken import org.jetbrains.kotlin.lexer.JetTokens.* -import com.intellij.psi.PsiComment -import com.intellij.psi.PsiWhiteSpace -import org.jetbrains.kotlin.psi.JetModifierListOwner -import org.jetbrains.kotlin.psi.JetPsiFactory -import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.psi.JetAnnotation -import org.jetbrains.kotlin.psi.JetModifierList +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.siblings +private fun createModifierList(text: String, owner: JetModifierListOwner): JetModifierList { + val newModifierList = JetPsiFactory(owner).createModifierList(text) + val anchor = owner.firstChild!! + .siblings(forward = true) + .dropWhile { it is PsiComment || it is PsiWhiteSpace } + .first() + return owner.addBefore(newModifierList, anchor) as JetModifierList +} + internal fun addModifier(owner: JetModifierListOwner, modifier: JetModifierKeywordToken, defaultVisibilityModifier: JetModifierKeywordToken) { - val modifierList = owner.getModifierList() + val modifierList = owner.modifierList if (modifierList == null) { if (modifier == defaultVisibilityModifier) return - - val newModifierList = JetPsiFactory(owner).createModifierList(modifier) - val anchor = owner.getFirstChild()!!.siblings(forward = true) - .dropWhile { it is PsiComment || it is PsiWhiteSpace } - .first() - owner.addBefore(newModifierList, anchor) + createModifierList(modifier.value, owner) } else { addModifier(modifierList, modifier, defaultVisibilityModifier) } } +internal fun addAnnotationEntry(owner: JetModifierListOwner, annotationEntry: JetAnnotationEntry): JetAnnotationEntry { + val modifierList = owner.modifierList + return if (modifierList == null) { + createModifierList(annotationEntry.text, owner).annotationEntries.first() + } + else { + modifierList.addBefore(annotationEntry, modifierList.firstChild) as JetAnnotationEntry + } +} + internal fun addModifier(modifierList: JetModifierList, modifier: JetModifierKeywordToken, defaultVisibilityModifier: JetModifierKeywordToken) { val newModifier = JetPsiFactory(modifierList).createModifier(modifier) val modifierToReplace = MODIFIERS_TO_REPLACE[modifier]