update copyright
[fedora-idea.git] / java / java-impl / src / com / intellij / psi / impl / source / codeStyle / JavaHelper.java
bloba9f47c806db3a2b1a8ee88a4d1f58d34539e3f17
1 /*
2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * @author max
20 package com.intellij.psi.impl.source.codeStyle;
22 import com.intellij.lang.ASTNode;
23 import com.intellij.openapi.fileTypes.FileType;
24 import com.intellij.openapi.project.Project;
25 import com.intellij.psi.impl.source.tree.CompositeElement;
26 import com.intellij.psi.impl.source.tree.ElementType;
27 import com.intellij.psi.impl.source.tree.TreeUtil;
29 public class JavaHelper extends Helper {
30 public JavaHelper(final FileType fileType, final Project project) {
31 super(fileType, project);
34 protected int getIndentInner(final ASTNode element, final boolean includeNonSpace, final int recursionLevel) {
35 if (recursionLevel > TOO_BIG_WALK_THRESHOULD) return 0;
37 if (element.getTreePrev() != null) {
38 ASTNode prev = element.getTreePrev();
39 ASTNode lastCompositePrev;
40 while (prev instanceof CompositeElement && !TreeUtil.isStrongWhitespaceHolder(prev.getElementType())) {
41 lastCompositePrev = prev;
42 prev = prev.getLastChildNode();
43 if (prev == null) { // element.prev is "empty composite"
44 return getIndentInner(lastCompositePrev, includeNonSpace, recursionLevel + 1);
48 String text = prev.getText();
49 int index = Math.max(text.lastIndexOf('\n'), text.lastIndexOf('\r'));
51 if (index >= 0) {
52 return getIndent(text.substring(index + 1), includeNonSpace);
55 if (includeNonSpace) {
56 return getIndentInner(prev, includeNonSpace, recursionLevel + 1) + getIndent(text, includeNonSpace);
59 if (element.getElementType() == ElementType.CODE_BLOCK) {
60 ASTNode parent = element.getTreeParent();
61 if (parent.getElementType() == ElementType.BLOCK_STATEMENT) {
62 parent = parent.getTreeParent();
64 if (parent.getElementType() != ElementType.CODE_BLOCK) {
65 //Q: use some "anchor" part of parent for some elements?
66 // e.g. for method it could be declaration start, not doc-comment
67 return getIndentInner(parent, includeNonSpace, recursionLevel + 1);
70 else {
71 if (element.getElementType() == ElementType.LBRACE) {
72 return getIndentInner(element.getTreeParent(), includeNonSpace, recursionLevel + 1);
75 //Q: any other cases?
77 ASTNode parent = prev.getTreeParent();
78 ASTNode child = prev;
79 while (parent != null) {
80 if (child.getTreePrev() != null) break;
81 child = parent;
82 parent = parent.getTreeParent();
85 if (parent == null) {
86 return getIndent(text, includeNonSpace);
88 else {
89 if (prev.getTreeParent().getElementType() == ElementType.LABELED_STATEMENT) {
90 return getIndentInner(prev, true, recursionLevel + 1) + getIndent(text, true);
92 else
93 return getIndentInner(prev, includeNonSpace, recursionLevel + 1);
96 else {
97 if (element.getTreeParent() == null) {
98 return 0;
100 return getIndentInner(element.getTreeParent(), includeNonSpace, recursionLevel + 1);