blob: 9d43379ce92092b1f8dd36f5c1dd2a240113f3b6 [file] [log] [blame]
/*
* 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.intellij.codeInsight.editorActions.smartEnter;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.*;
import com.intellij.util.text.CharArrayUtil;
/**
* Created by IntelliJ IDEA.
* User: max
* Date: Sep 8, 2003
* Time: 2:35:36 PM
* To change this template use Options | File Templates.
*/
public class AfterSemicolonEnterProcessor implements EnterProcessor {
@Override
public boolean doEnter(Editor editor, PsiElement psiElement, boolean isModified) {
if (psiElement instanceof PsiExpressionStatement ||
psiElement instanceof PsiDeclarationStatement ||
psiElement instanceof PsiDoWhileStatement ||
psiElement instanceof PsiReturnStatement ||
psiElement instanceof PsiThrowStatement ||
psiElement instanceof PsiBreakStatement ||
psiElement instanceof PsiContinueStatement ||
psiElement instanceof PsiAssertStatement ||
psiElement instanceof PsiField ||
psiElement instanceof PsiImportStatementBase ||
psiElement instanceof PsiMethod && (((PsiMethod) psiElement).getContainingClass().isInterface() ||
((PsiMethod) psiElement).hasModifierProperty(PsiModifier.ABSTRACT) ||
((PsiMethod) psiElement).hasModifierProperty(PsiModifier.NATIVE))) {
int errorOffset = getErrorElementOffset(psiElement);
int elementEndOffset = psiElement.getTextRange().getEndOffset();
if (psiElement instanceof PsiEnumConstant) {
final CharSequence text = editor.getDocument().getCharsSequence();
final int commaOffset = CharArrayUtil.shiftForwardUntil(text, elementEndOffset, ",");
if (commaOffset < text.length()) {
elementEndOffset = commaOffset + 1;
}
}
if (errorOffset >= 0 && errorOffset < elementEndOffset) {
final CharSequence text = editor.getDocument().getCharsSequence();
if (text.charAt(errorOffset) == ' ' && text.charAt(errorOffset + 1) == ';') {
errorOffset++;
}
}
editor.getCaretModel().moveToOffset(errorOffset >= 0 ? errorOffset : elementEndOffset);
return isModified;
}
return false;
}
private static int getErrorElementOffset(PsiElement elt) {
final int[] offset = { -1 };
elt.accept(new PsiRecursiveElementWalkingVisitor() {
@Override public void visitErrorElement(PsiErrorElement element) {
if (offset[0] == -1) offset[0] = element.getTextRange().getStartOffset();
}
});
return offset[0];
}
}