diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetProperty.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetProperty.java index b2eae187369..eddba6ad3fe 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetProperty.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetProperty.java @@ -137,4 +137,9 @@ public class JetProperty extends JetTypeParameterListOwner implements JetModifie public ASTNode getValOrVarNode() { return getNode().findChildByType(TokenSet.create(VAL_KEYWORD, VAR_KEYWORD)); } + + @Nullable + public ASTNode getEqualsSign() { + return getNode().findChildByType(TokenSet.create(EQ)); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.java index d375c9b7f0b..5a849bb7826 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.psi; +import com.intellij.lang.ASTNode; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; @@ -24,6 +25,7 @@ import com.intellij.util.LocalTimeCounter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lexer.JetKeywordToken; +import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.plugin.JetFileType; import java.util.List; @@ -32,6 +34,16 @@ import java.util.List; * @author max */ public class JetPsiFactory { + public static ASTNode createValNode(Project project) { + JetProperty property = createProperty(project, "val x = 1"); + return property.getValOrVarNode(); + } + + public static ASTNode createVarNode(Project project) { + JetProperty property = createProperty(project, "var x = 1"); + return property.getValOrVarNode(); + } + public static JetExpression createExpression(Project project, String text) { JetProperty property = createProperty(project, "val x = " + text); return property.getInitializer(); @@ -48,6 +60,11 @@ public class JetPsiFactory { return Pair.create(property.findElementAt(5), property.findElementAt(7)); } + public static ASTNode createColonNode(Project project) { + JetProperty property = createProperty(project, "val x: Int"); + return property.getNode().findChildByType(JetTokens.COLON); + } + public static PsiElement createWhiteSpace(Project project) { return createWhiteSpace(project, " "); } diff --git a/examples/example-vfs/src/Test.kt b/examples/example-vfs/src/Test.kt deleted file mode 100644 index 804f1a931a6..00000000000 --- a/examples/example-vfs/src/Test.kt +++ /dev/null @@ -1,8 +0,0 @@ -fun a(op: (Int) -> Int) {} -fun b() { - a {it} - a { - it - } - 2 + 2 -} \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/introduceVariable/JetChangePropertyActions.java b/idea/src/org/jetbrains/jet/plugin/refactoring/introduceVariable/JetChangePropertyActions.java new file mode 100644 index 00000000000..d278d9124eb --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/introduceVariable/JetChangePropertyActions.java @@ -0,0 +1,58 @@ +package org.jetbrains.jet.plugin.refactoring.introduceVariable; + +import com.intellij.lang.ASTNode; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiWhiteSpace; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetProperty; +import org.jetbrains.jet.lang.psi.JetPsiFactory; +import org.jetbrains.jet.lang.psi.JetTypeReference; +import org.jetbrains.jet.lang.types.JetType; + +/** + * User: Alefas + * Date: 14.02.12 + */ +public class JetChangePropertyActions { + private JetChangePropertyActions() { + } + + public static void declareValueOrVariable(Project project, boolean isVariable, JetProperty property) { + ASTNode node; + if (isVariable) { + node = JetPsiFactory.createVarNode(project); + } else { + node = JetPsiFactory.createValNode(project); + } + property.getValOrVarNode().getPsi().replace(node.getPsi()); + } + + public static void addTypeAnnotation(Project project, JetProperty property, @NotNull JetType exprType) { + if (property.getPropertyTypeRef() != null) return; + PsiElement anchor = property.getNameIdentifier(); + if (anchor == null) return; + anchor = anchor.getNextSibling(); + if (anchor == null || !(anchor instanceof PsiWhiteSpace)) return; + JetTypeReference typeReference = JetPsiFactory.createType(project, exprType.toString()); + ASTNode colon = JetPsiFactory.createColonNode(project); + ASTNode anchorNode = anchor.getNode().getTreeNext(); + property.getNode().addChild(colon, anchorNode); + property.getNode().addChild(JetPsiFactory.createWhiteSpace(project).getNode(), anchorNode); + property.getNode().addChild(typeReference.getNode(), anchorNode); + property.getNode().addChild(JetPsiFactory.createWhiteSpace(project).getNode(), anchorNode); + anchor.delete(); + } + + public static void removeTypeAnnotation(Project project, JetProperty property) { + JetTypeReference propertyTypeRef = property.getPropertyTypeRef(); + if (propertyTypeRef == null) return; + PsiElement identifier = property.getNameIdentifier(); + if (identifier == null) return; + PsiElement sibling = identifier.getNextSibling(); + if (sibling == null) return; + PsiElement nextSibling = propertyTypeRef.getNextSibling(); + if (nextSibling == null) return; + sibling.getParent().getNode().removeRange(sibling.getNode(), nextSibling.getNode()); + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/introduceVariable/JetInplaceVariableIntroducer.java b/idea/src/org/jetbrains/jet/plugin/refactoring/introduceVariable/JetInplaceVariableIntroducer.java index 053ec261d05..cbdba98f6f0 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/introduceVariable/JetInplaceVariableIntroducer.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/introduceVariable/JetInplaceVariableIntroducer.java @@ -16,15 +16,25 @@ package org.jetbrains.jet.plugin.refactoring.introduceVariable; +import com.intellij.openapi.application.Result; +import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiNamedElement; import com.intellij.refactoring.introduce.inplace.InplaceVariableIntroducer; +import com.intellij.ui.NonFocusableCheckBox; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetProperty; +import org.jetbrains.jet.lang.types.JetType; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; /** * User: Alefas @@ -34,14 +44,88 @@ public class JetInplaceVariableIntroducer extends InplaceVariableIntroducer