c34e5ab7aa101f79ff1384317397e335d82ec613
[idea/community.git] / platform / core-impl / src / com / intellij / psi / impl / PsiParserFacadeImpl.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.impl;
18
19 import com.intellij.lang.ASTFactory;
20 import com.intellij.lang.Commenter;
21 import com.intellij.lang.Language;
22 import com.intellij.lang.LanguageCommenters;
23 import com.intellij.openapi.fileTypes.LanguageFileType;
24 import com.intellij.psi.*;
25 import com.intellij.psi.impl.source.DummyHolderFactory;
26 import com.intellij.psi.impl.source.SourceTreeToPsiMap;
27 import com.intellij.psi.impl.source.tree.FileElement;
28 import com.intellij.psi.impl.source.tree.LeafElement;
29 import com.intellij.psi.impl.source.tree.TreeElement;
30 import com.intellij.util.IncorrectOperationException;
31 import org.jetbrains.annotations.NonNls;
32 import org.jetbrains.annotations.NotNull;
33
34 /**
35  * @author yole
36  */
37 public class PsiParserFacadeImpl implements PsiParserFacade {
38   protected final PsiManagerEx myManager;
39
40   public PsiParserFacadeImpl(PsiManagerEx manager) {
41     myManager = manager;
42   }
43
44   @Override
45   @NotNull
46   public PsiElement createWhiteSpaceFromText(@NotNull @NonNls String text) throws IncorrectOperationException {
47     final FileElement holderElement = DummyHolderFactory.createHolder(myManager, null).getTreeElement();
48     final LeafElement newElement = ASTFactory.leaf(TokenType.WHITE_SPACE, holderElement.getCharTable().intern(text));
49     holderElement.rawAddChildren(newElement);
50     GeneratedMarkerVisitor.markGenerated(newElement.getPsi());
51     return newElement.getPsi();
52   }
53
54   @Override
55   @NotNull
56   public PsiComment createLineCommentFromText(@NotNull final LanguageFileType fileType,
57                                               @NotNull final String text) throws IncorrectOperationException {
58     Commenter commenter = LanguageCommenters.INSTANCE.forLanguage(fileType.getLanguage());
59     assert commenter != null;
60     String prefix = commenter.getLineCommentPrefix();
61     if (prefix == null) {
62       throw new IncorrectOperationException("No line comment prefix defined for language " + fileType.getLanguage().getID());
63     }
64
65     PsiFile aFile = createDummyFile(prefix + text, fileType);
66     return findPsiCommentChild(aFile);
67   }
68
69   @NotNull
70   @Override
71   public PsiComment createBlockCommentFromText(@NotNull Language language, @NotNull String text) throws IncorrectOperationException {
72     Commenter commenter = LanguageCommenters.INSTANCE.forLanguage(language);
73     assert commenter != null : language;
74     final String blockCommentPrefix = commenter.getBlockCommentPrefix();
75     final String blockCommentSuffix = commenter.getBlockCommentSuffix();
76
77     PsiFile aFile = PsiFileFactory.getInstance(myManager.getProject()).createFileFromText("_Dummy_", language,
78                                                                                           (blockCommentPrefix + text + blockCommentSuffix));
79     return findPsiCommentChild(aFile);
80   }
81
82   @Override
83   @NotNull
84   public PsiComment createLineOrBlockCommentFromText(@NotNull Language lang, @NotNull String text)
85     throws IncorrectOperationException {
86     Commenter commenter = LanguageCommenters.INSTANCE.forLanguage(lang);
87     assert commenter != null:lang;
88     String prefix = commenter.getLineCommentPrefix();
89     final String blockCommentPrefix = commenter.getBlockCommentPrefix();
90     final String blockCommentSuffix = commenter.getBlockCommentSuffix();
91     assert prefix != null || (blockCommentPrefix != null && blockCommentSuffix != null);
92
93     PsiFile aFile = PsiFileFactory.getInstance(myManager.getProject()).createFileFromText("_Dummy_", lang, prefix != null ? (prefix + text) : (blockCommentPrefix + text + blockCommentSuffix));
94     return findPsiCommentChild(aFile);
95   }
96
97   private PsiComment findPsiCommentChild(PsiFile aFile) {
98     PsiElement[] children = aFile.getChildren();
99     for (PsiElement aChildren : children) {
100       if (aChildren instanceof PsiComment) {
101         PsiComment comment = (PsiComment)aChildren;
102         DummyHolderFactory.createHolder(myManager, (TreeElement)SourceTreeToPsiMap.psiElementToTree(comment), null);
103         return comment;
104       }
105     }
106     throw new IncorrectOperationException("Incorrect comment \"" + aFile.getText() + "\".");
107   }
108
109   protected PsiFile createDummyFile(String text, final LanguageFileType fileType) {
110     String ext = fileType.getDefaultExtension();
111     @NonNls String fileName = "_Dummy_." + ext;
112
113     return PsiFileFactory.getInstance(myManager.getProject()).createFileFromText(fileType, fileName, text, 0, text.length());
114   }
115 }