diff --git a/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiLocalVariableImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiLocalVariableImpl.java index 0f6303a6781a..36cecf8b3874 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiLocalVariableImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiLocalVariableImpl.java @@ -70,7 +70,9 @@ public class PsiLocalVariableImpl extends CompositePsiElement implements PsiLoca @NotNull public final PsiIdentifier getNameIdentifier() { - return (PsiIdentifier)findChildByRoleAsPsiElement(ChildRole.NAME); + final PsiElement element = findChildByRoleAsPsiElement(ChildRole.NAME); + assert element instanceof PsiIdentifier : getText(); + return (PsiIdentifier)element; } @NotNull @@ -98,15 +100,18 @@ public class PsiLocalVariableImpl extends CompositePsiElement implements PsiLoca @NotNull public PsiTypeElement getTypeElement() { - ASTNode first = getTreeParent().findChildByType(LOCAL_VARIABLE); - return SourceTreeToPsiMap.treeToPsiNotNull(first.findChildByType(TYPE)); + final ASTNode first = getTreeParent().findChildByType(LOCAL_VARIABLE); + assert first != null : getText(); + final ASTNode type = first.findChildByType(TYPE); + assert type != null : getText(); + return SourceTreeToPsiMap.treeToPsiNotNull(type); } public PsiModifierList getModifierList() { - CompositeElement parent = getTreeParent(); + final CompositeElement parent = getTreeParent(); if (parent == null) return null; - CompositeElement first = (CompositeElement)parent.findChildByType(LOCAL_VARIABLE); - return (PsiModifierList)first.findChildByRoleAsPsiElement(ChildRole.MODIFIER_LIST); + final CompositeElement first = (CompositeElement)parent.findChildByType(LOCAL_VARIABLE); + return first != null ? (PsiModifierList)first.findChildByRoleAsPsiElement(ChildRole.MODIFIER_LIST) : null; } public boolean hasModifierProperty(@NotNull String name) { @@ -146,18 +151,22 @@ public class PsiLocalVariableImpl extends CompositePsiElement implements PsiLoca CheckUtil.checkWritable(this); final CharTable treeCharTab = SharedImplUtil.findCharTableByTree(this); - CompositeElement statement = getTreeParent(); - PsiElement[] variables = ((PsiDeclarationStatement)SourceTreeToPsiMap.treeElementToPsi(statement)).getDeclaredElements(); - if (variables.length > 1){ - //CodeStyleManagerImpl codeStyleManager = (CodeStyleManagerImpl)getManager().getCodeStyleManager(); + final CompositeElement statement = getTreeParent(); + final PsiElement psiElement = SourceTreeToPsiMap.treeElementToPsi(statement); + final PsiElement[] variables = psiElement instanceof PsiDeclarationStatement + ? ((PsiDeclarationStatement)psiElement).getDeclaredElements() : PsiElement.EMPTY_ARRAY; + if (variables.length > 1) { + final PsiModifierList modifierList = getModifierList(); + final PsiTypeElement typeElement = getTypeElement(); + assert modifierList != null : getText(); ASTNode last = statement; - for(int i = 1; i < variables.length; i++){ - ASTNode typeCopy = getTypeElement().copy().getNode(); - ASTNode modifierListCopy = getModifierList().copy().getNode(); - CompositeElement variable = (CompositeElement)SourceTreeToPsiMap.psiElementToTree(variables[i]); + for (int i = 1; i < variables.length; i++) { + ASTNode typeCopy = typeElement.copy().getNode(); + ASTNode modifierListCopy = modifierList.copy().getNode(); + CompositeElement variable = (CompositeElement)SourceTreeToPsiMap.psiToTreeNotNull(variables[i]); ASTNode comma = TreeUtil.skipElementsBack(variable.getTreePrev(), StdTokenSets.WHITE_SPACE_OR_COMMENT_BIT_SET); - if (comma != null && comma.getElementType() == JavaTokenType.COMMA){ + if (comma != null && comma.getElementType() == JavaTokenType.COMMA) { CodeEditUtil.removeChildren(statement, comma, variable.getTreePrev()); } @@ -171,7 +180,7 @@ public class PsiLocalVariableImpl extends CompositePsiElement implements PsiLoca variable.addChild(typeCopy, variable.getFirstChildNode()); - if (modifierListCopy.getTextLength() > 0){ + if (modifierListCopy.getTextLength() > 0) { space = Factory.createSingleLeafElement(JavaTokenType.WHITE_SPACE, " ", 0, 1, treeCharTab, getManager()); variable.addChild(space, variable.getFirstChildNode()); } @@ -179,12 +188,10 @@ public class PsiLocalVariableImpl extends CompositePsiElement implements PsiLoca variable.addChild(modifierListCopy, variable.getFirstChildNode()); ASTNode semicolon = Factory.createSingleLeafElement(JavaTokenType.SEMICOLON, ";", 0, 1, treeCharTab, getManager()); - SourceTreeToPsiMap.psiElementToTree(variables[i - 1]).addChild(semicolon, null); + SourceTreeToPsiMap.psiToTreeNotNull(variables[i - 1]).addChild(semicolon, null); CodeEditUtil.addChild(statement.getTreeParent(), statement1, last.getTreeNext()); - //? - //codeStyleManager.adjustInsertedCode(statement1); last = statement1; } } diff --git a/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiResourceVariableImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiResourceVariableImpl.java index 83ea6d9f5176..ccd3a066698f 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiResourceVariableImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiResourceVariableImpl.java @@ -20,6 +20,7 @@ import com.intellij.psi.impl.source.tree.JavaElementType; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; @@ -51,13 +52,13 @@ public class PsiResourceVariableImpl extends PsiLocalVariableImpl implements Psi @Override public void delete() throws IncorrectOperationException { final PsiElement next = PsiTreeUtil.skipSiblingsForward(this, PsiWhiteSpace.class, PsiComment.class); - if (next instanceof PsiJavaToken && ((PsiJavaToken)next).getTokenType() == JavaTokenType.SEMICOLON) { + if (PsiUtil.isJavaToken(next, JavaTokenType.SEMICOLON)) { getParent().deleteChildRange(this, next); return; } final PsiElement prev = PsiTreeUtil.skipSiblingsBackward(this, PsiWhiteSpace.class, PsiComment.class); - if (prev instanceof PsiJavaToken && ((PsiJavaToken)prev).getTokenType() == JavaTokenType.SEMICOLON) { + if (PsiUtil.isJavaToken(prev, JavaTokenType.SEMICOLON)) { getParent().deleteChildRange(prev, this); return; } diff --git a/java/openapi/src/com/intellij/psi/util/PsiUtil.java b/java/openapi/src/com/intellij/psi/util/PsiUtil.java index d26afc76cf20..25fef64b0ffd 100644 --- a/java/openapi/src/com/intellij/psi/util/PsiUtil.java +++ b/java/openapi/src/com/intellij/psi/util/PsiUtil.java @@ -894,4 +894,8 @@ public final class PsiUtil extends PsiUtilBase { element.getParent() instanceof PsiTryStatement && ((PsiTryStatement)element.getParent()).getTryBlock() == element; } + + public static boolean isJavaToken(@Nullable final PsiElement element, final IElementType type) { + return element instanceof PsiJavaToken && ((PsiJavaToken)element).getTokenType() == type; + } }