CPP-3103: Conditionally uncompiled code unexpectedly formatted
[idea/community.git] / platform / platform-tests / testSrc / com / intellij / formatting / TestFormattingModel.java
1 /*
2  * Copyright 2000-2013 JetBrains s.r.o.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 package com.intellij.formatting;
17
18 import com.intellij.lang.ASTNode;
19 import com.intellij.openapi.application.ApplicationManager;
20 import com.intellij.openapi.command.WriteCommandAction;
21 import com.intellij.openapi.editor.Document;
22 import com.intellij.openapi.editor.impl.DocumentImpl;
23 import com.intellij.openapi.util.TextRange;
24 import com.intellij.psi.formatter.CompositeWhiteSpaceFormattingStrategy;
25 import com.intellij.psi.formatter.StaticSymbolWhiteSpaceDefinitionStrategy;
26 import com.intellij.psi.formatter.WhiteSpaceFormattingStrategy;
27 import org.jetbrains.annotations.NotNull;
28
29 import java.util.Arrays;
30
31 public class TestFormattingModel implements FormattingModel, FormattingDocumentModel{
32
33   private final CompositeWhiteSpaceFormattingStrategy myWhiteSpaceStrategy = new CompositeWhiteSpaceFormattingStrategy(
34     Arrays.<WhiteSpaceFormattingStrategy>asList(
35       new StaticSymbolWhiteSpaceDefinitionStrategy(' ', '\t', '\n')
36     )
37   );
38   private final Document myDocument;
39   private Block myRootBlock;
40
41   public TestFormattingModel(String text) {
42     myDocument = new DocumentImpl(text);
43   }
44
45   public TestFormattingModel(final Document document) {
46     myDocument = document;
47   }
48
49   public void setRootBlock(final Block rootBlock) {
50     myRootBlock = rootBlock;
51   }
52
53   @Override
54   public int getLineNumber(int offset) {
55     return myDocument.getLineNumber(offset);
56   }
57
58   @Override
59   public int getLineStartOffset(int line) {
60     return myDocument.getLineStartOffset(line);
61   }
62
63   @Override
64   public TextRange replaceWhiteSpace(final TextRange textRange,
65                                 final String whiteSpace
66   ) {
67     if (ApplicationManager.getApplication() != null) {
68       WriteCommandAction.runWriteCommandAction(null, new Runnable() {
69         @Override
70         public void run() {
71           myDocument.replaceString(textRange.getStartOffset(), textRange.getEndOffset(), whiteSpace);
72         }
73       });
74     } else {
75       myDocument.replaceString(textRange.getStartOffset(), textRange.getEndOffset(), whiteSpace);
76     }
77
78     return new TextRange(textRange.getStartOffset(), textRange.getStartOffset() + whiteSpace.length());
79   }
80
81   @Override
82   public CharSequence getText(final TextRange textRange) {
83     return myDocument.getCharsSequence().subSequence(textRange.getStartOffset(), textRange.getEndOffset());
84   }
85
86   @Override
87   @NotNull
88   public FormattingDocumentModel getDocumentModel() {
89     return this;
90   }
91
92   @Override
93   @NotNull
94   public Block getRootBlock() {
95     return myRootBlock;
96   }
97
98   @Override
99   public void commitChanges() {
100   }
101
102   @Override
103   public int getTextLength() {
104     return myDocument.getTextLength();
105   }
106
107   @NotNull
108   @Override
109   public Document getDocument() {
110     return myDocument;
111   }
112
113   @Override
114   public TextRange shiftIndentInsideRange(ASTNode node, TextRange range, int indent) {
115     return range;
116   }
117
118   @Override
119   public boolean containsWhiteSpaceSymbolsOnly(int startOffset, int endOffset) {
120     return myWhiteSpaceStrategy.check(myDocument.getCharsSequence(), startOffset, endOffset) >= endOffset;
121   }
122
123   @NotNull
124   @Override
125   public CharSequence adjustWhiteSpaceIfNecessary(@NotNull CharSequence whiteSpaceText, int startOffset, int endOffset,
126                                                   ASTNode nodeAfter, boolean changedViaPsi) {
127     return whiteSpaceText;
128   }
129
130   //@Override
131   //public boolean isWhiteSpaceSymbol(char symbol) {
132   //  return containsWhiteSpaceSymbolsOnly(CharBuffer.wrap(new char[] {symbol}), 0, 1);
133   //}
134
135   //private boolean containsWhiteSpaceSymbolsOnly(CharSequence text, int startOffset, int endOffset) {
136   //  return myWhiteSpaceStrategy.check(myDocument.getCharsSequence(), startOffset, endOffset) >= endOffset;
137   //}
138 }