faster reformat for javascript when document == psifile content
[idea/community.git] / platform / lang-impl / src / com / intellij / psi / formatter / FormattingDocumentModelImpl.java
1 /*
2  * Copyright 2000-2009 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
17 package com.intellij.psi.formatter;
18
19 import com.intellij.formatting.FormattingDocumentModel;
20 import com.intellij.openapi.diagnostic.Logger;
21 import com.intellij.openapi.editor.Document;
22 import com.intellij.openapi.editor.impl.DocumentImpl;
23 import com.intellij.openapi.project.Project;
24 import com.intellij.openapi.util.TextRange;
25 import com.intellij.psi.PsiDocumentManager;
26 import com.intellij.psi.PsiFile;
27 import com.intellij.psi.impl.PsiDocumentManagerImpl;
28 import com.intellij.psi.impl.PsiToDocumentSynchronizer;
29 import org.jetbrains.annotations.NotNull;
30
31 public class FormattingDocumentModelImpl implements FormattingDocumentModel{
32
33   private final Document myDocument;
34   private final PsiFile myFile;
35   private static final Logger LOG = Logger.getInstance("#com.intellij.psi.formatter.FormattingDocumentModelImpl");
36
37   public FormattingDocumentModelImpl(final Document document, PsiFile file) {
38     myDocument = document;
39     myFile = file;
40   }
41
42   public static FormattingDocumentModelImpl createOn(PsiFile file) {
43     Document document = getDocumentToBeUsedFor(file);
44     if (document != null) {
45       if (PsiDocumentManager.getInstance(file.getProject()).isUncommited(document)) {
46         LOG.error("Document is uncommited");
47       }
48       if (!document.getText().equals(file.getText())) {
49         LOG.error(
50           "Document and psi file texts should be equal : \nDocument text:\n" + document.getText() + "\nFile text:\n" + file.getText());
51       }
52       return new FormattingDocumentModelImpl(document, file);
53     }
54     else {
55       return new FormattingDocumentModelImpl(new DocumentImpl(file.getText()), file);
56     }
57
58   }
59
60   public static Document getDocumentToBeUsedFor(final PsiFile file) {
61     final Project project = file.getProject();
62     final Document document = PsiDocumentManager.getInstance(project).getDocument(file);
63     if (document == null) return null;
64     if (PsiDocumentManager.getInstance(project).isUncommited(document)) return null;
65     PsiToDocumentSynchronizer synchronizer = ((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(file.getProject())).getSynchronizer();
66     if (synchronizer.isDocumentAffectedByTransactions(document)) return null;
67
68     return document;
69   }
70
71   public int getLineNumber(int offset) {
72     LOG.assertTrue (offset <= myDocument.getTextLength());
73     return myDocument.getLineNumber(offset);
74   }
75
76   public int getLineStartOffset(int line) {
77     return myDocument.getLineStartOffset(line);
78   }
79
80   public CharSequence getText(final TextRange textRange) {
81     return myDocument.getCharsSequence().subSequence(textRange.getStartOffset(), textRange.getEndOffset());
82   }
83
84   public int getTextLength() {
85     return myDocument.getTextLength();
86   }
87
88   public Document getDocument() {
89     return myDocument;
90   }
91
92   public PsiFile getFile() {
93     return myFile;
94   }
95
96   public static boolean canUseDocumentModel(@NotNull Document document,@NotNull PsiFile file) {
97     PsiDocumentManager psiDocumentManager = PsiDocumentManager.getInstance(file.getProject());
98     return !psiDocumentManager.isUncommited(document) &&
99            !psiDocumentManager.isDocumentBlockedByPsi(document) &&
100            file.getText().equals(document.getText());
101   }
102 }