Initial implementation of KT-4046 Support 'Create constructor matching superclass'

#KT-4046 Fixed
This commit is contained in:
Valentin Kipyatkov
2015-05-08 19:49:40 +03:00
parent 734b502ad6
commit 00dcbd4d93
25 changed files with 308 additions and 34 deletions
@@ -78,6 +78,24 @@ public class JetClass extends JetTypeParameterListOwnerStub<KotlinClassStub> imp
return list.getParameters();
}
@NotNull
public JetPrimaryConstructor getOrCreatePrimaryConstructor() {
JetPrimaryConstructor constructor = getPrimaryConstructor();
if (constructor != null) return constructor;
PsiElement anchor = getTypeParameterList();
if (anchor == null) anchor = getNameIdentifier();
if (anchor == null) anchor = getLastChild();
return (JetPrimaryConstructor) addAfter(new JetPsiFactory(getProject()).createPrimaryConstructor(), anchor);
}
@NotNull
public JetParameterList getOrCreatePrimaryConstructorParameterList() {
JetPrimaryConstructor constructor = getOrCreatePrimaryConstructor();
JetParameterList parameterList = constructor.getValueParameterList();
if (parameterList != null) return parameterList;
return (JetParameterList) constructor.add(new JetPsiFactory(getProject()).createParameterList("()"));
}
@Override
@Nullable
public JetDelegationSpecifierList getDelegationSpecifierList() {
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.psi;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.lexer.JetTokens;
import org.jetbrains.kotlin.psi.stubs.KotlinPlaceHolderStub;
import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes;
@@ -44,6 +45,57 @@ public class JetParameterList extends JetElementImplStub<KotlinPlaceHolderStub<J
return getStubOrPsiChildrenAsList(JetStubElementTypes.VALUE_PARAMETER);
}
@NotNull
public JetParameter addParameter(@NotNull JetParameter parameter) {
return addParameterBefore(parameter, null);
}
@NotNull
public JetParameter addParameterAfter(@NotNull JetParameter parameter, @Nullable JetParameter anchor) {
assert anchor == null || anchor.getParent() == this;
List<JetParameter> parameters = getParameters();
if (parameters.isEmpty()) {
if (getFirstChild().getNode().getElementType() == JetTokens.LPAR) {
return (JetParameter) addAfter(parameter, getFirstChild());
}
else {
return (JetParameter) add(parameter);
}
}
else {
PsiElement comma = new JetPsiFactory(getProject()).createComma();
if (anchor != null) {
comma = addAfter(comma, anchor);
return (JetParameter) addAfter(parameter, comma);
}
else {
comma = addBefore(comma, parameters.get(0));
return (JetParameter) addBefore(parameter, comma);
}
}
}
@NotNull
public JetParameter addParameterBefore(@NotNull JetParameter parameter, @Nullable JetParameter anchor) {
List<JetParameter> parameters = getParameters();
JetParameter anchorAfter;
if (parameters.isEmpty()) {
assert anchor == null;
anchorAfter = null;
}
else {
if (anchor != null) {
int index = parameters.indexOf(anchor);
assert index >= 0;
anchorAfter = index > 0 ? parameters.get(index - 1) : null;
}
else {
anchorAfter = parameters.get(parameters.size() - 1);
}
}
return addParameterAfter(parameter, anchorAfter);
}
// this method needed only for migrate lambda syntax
@Deprecated
public boolean isParenthesized() {