blob: 8f8773006da1a53257db2c14376bcfbb7a4dfa40 [file] [log] [blame]
/*
* Copyright 2000-2014 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 org.jetbrains.plugins.groovy.intentions.comments;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiComment;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementFactory;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.intentions.base.Intention;
import org.jetbrains.plugins.groovy.intentions.base.PsiElementPredicate;
import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes;
import java.util.ArrayList;
import java.util.List;
public class ChangeToCStyleCommentIntention extends Intention {
@Override
@NotNull
protected PsiElementPredicate getElementPredicate() {
return new EndOfLineCommentPredicate();
}
@Override
public void processIntention(@NotNull PsiElement element, Project project, Editor editor)
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 JavaPsiFacade manager = JavaPsiFacade.getInstance(selectedComment.getProject());
final PsiElementFactory factory = manager.getElementFactory();
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() + " " //to get the whitespace for proper spacing
+ getCommentContents((PsiComment) nextComment);
commentsToDelete.add(nextComment);
}
final PsiComment newComment =
factory.createCommentFromText("/*" + text + " */", 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", "").isEmpty()) {
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", "").isEmpty()) {
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 GroovyTokenTypes.mSL_COMMENT.equals(tokenType);
}
private static String getCommentContents(PsiComment comment) {
final String text = comment.getText();
return text.substring(2);
}
}