/* * Copyright 2000-2009 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.sylvanaar.idea.Lua.intentions.comments; import com.intellij.psi.PsiComment; import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; import com.intellij.util.IncorrectOperationException; import com.sylvanaar.idea.Lua.intentions.base.Intention; import com.sylvanaar.idea.Lua.intentions.base.PsiElementPredicate; import com.sylvanaar.idea.Lua.lang.lexer.LuaTokenTypes; import com.sylvanaar.idea.Lua.lang.psi.LuaPsiElementFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; public class ChangeToCStyleCommentIntention extends Intention { @NotNull protected PsiElementPredicate getElementPredicate() { return new EndOfLineCommentPredicate(); } public void processIntention(@NotNull PsiElement element) throws IncorrectOperationException { final PsiComment selectedComment = (PsiComment) element; PsiComment firstComment = selectedComment; while (true) { final PsiElement prevComment = getPrevNonWhiteSpace(firstComment); if (!isEndOfLineComment(prevComment)) { break; } firstComment = (PsiComment) prevComment; } final LuaPsiElementFactory factory = LuaPsiElementFactory.getInstance(element.getProject()); String text = getCommentContents(firstComment); final List<PsiElement> commentsToDelete = new ArrayList<PsiElement>(); PsiElement nextComment = firstComment; while (true) { nextComment = getNextNonWhiteSpace(nextComment); if (!isEndOfLineComment(nextComment)) { break; } text += nextComment.getPrevSibling().getText() + getCommentContents((PsiComment) nextComment); commentsToDelete.add(nextComment); } final PsiComment newComment = factory.createCommentFromText("--[[\n" + text + "\n]]", selectedComment.getParent()); firstComment.replace(newComment); for (PsiElement commentToDelete : commentsToDelete) { commentToDelete.delete(); } } @Nullable private PsiElement getNextNonWhiteSpace(PsiElement nextComment) { PsiElement elementToCheck = nextComment; while (true) { final PsiElement sibling = elementToCheck.getNextSibling(); if (sibling == null) { return null; } if (sibling.getText().trim().replace("\n", "").length() == 0) { elementToCheck = sibling; } else { return sibling; } } } @Nullable private PsiElement getPrevNonWhiteSpace(PsiElement nextComment) { PsiElement elementToCheck = nextComment; while (true) { final PsiElement sibling = elementToCheck.getPrevSibling(); if (sibling == null) { return null; } if (sibling.getText().trim().replace("\n", "").length() == 0) { elementToCheck = sibling; } else { return sibling; } } } private boolean isEndOfLineComment(PsiElement element) { if (!(element instanceof PsiComment)) { return false; } final PsiComment comment = (PsiComment) element; final IElementType tokenType = comment.getTokenType(); return LuaTokenTypes.SHORTCOMMENT.equals(tokenType); } private static String getCommentContents(PsiComment comment) { final String text = comment.getText(); return text.substring(2); } }