PSI: Added addAnnotationEntry() function

This commit is contained in:
Alexey Sedunov
2015-08-06 15:37:03 +03:00
parent e331f13a32
commit 556285f2c7
5 changed files with 52 additions and 14 deletions
@@ -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<JetAnnotationEntry> getAnnotationEntries() {
@@ -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);
}
@@ -60,6 +60,12 @@ public class JetModifierListOwnerStub<T extends StubElement<?>> extends JetEleme
AddRemoveModifierPackage.removeModifier(this, modifier);
}
@NotNull
@Override
public JetAnnotationEntry addAnnotationEntry(@NotNull JetAnnotationEntry annotationEntry) {
return AddRemoveModifierPackage.addAnnotationEntry(this, annotationEntry);
}
@Override
@NotNull
public List<JetAnnotationEntry> getAnnotationEntries() {
@@ -43,4 +43,16 @@ public class JetPrimaryConstructor : JetConstructor<JetPrimaryConstructor> {
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()
}
}
}
@@ -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]