4 package com
.intellij
.psi
.impl
;
6 import com
.intellij
.lang
.Language
;
7 import com
.intellij
.lang
.LanguageParserDefinitions
;
8 import com
.intellij
.lang
.ParserDefinition
;
9 import com
.intellij
.openapi
.diagnostic
.Logger
;
10 import com
.intellij
.openapi
.fileTypes
.FileType
;
11 import com
.intellij
.openapi
.fileTypes
.FileTypeManager
;
12 import com
.intellij
.openapi
.fileTypes
.LanguageFileType
;
13 import com
.intellij
.psi
.*;
14 import com
.intellij
.psi
.impl
.source
.PsiPlainTextFileImpl
;
15 import com
.intellij
.psi
.impl
.source
.codeStyle
.CodeEditUtil
;
16 import com
.intellij
.psi
.impl
.source
.tree
.TreeElement
;
17 import com
.intellij
.testFramework
.LightVirtualFile
;
18 import com
.intellij
.util
.LocalTimeCounter
;
19 import com
.intellij
.util
.text
.CharSequenceSubSequence
;
20 import org
.jetbrains
.annotations
.NotNull
;
21 import org
.jetbrains
.annotations
.Nullable
;
23 public class PsiFileFactoryImpl
extends PsiFileFactory
{
24 private static final Logger LOG
= Logger
.getInstance("#com.intellij.psi.impl.PsiFileFactoryImpl");
25 private final PsiManager myManager
;
27 public PsiFileFactoryImpl(final PsiManager manager
) {
32 public PsiFile
createFileFromText(@NotNull String name
, @NotNull FileType fileType
, @NotNull CharSequence text
,
33 long modificationStamp
, final boolean physical
) {
34 return createFileFromText(name
, fileType
, text
, modificationStamp
, physical
, true);
37 public PsiFile
createFileFromText(@NotNull String name
, @NotNull Language language
, @NotNull CharSequence text
) {
38 return createFileFromText(name
, language
, text
, true, true);
41 public PsiFile
createFileFromText(@NotNull String name
, @NotNull Language language
, @NotNull CharSequence text
, boolean physical
,
42 final boolean markAsCopy
) {
43 return trySetupPsiForFile(new LightVirtualFile(name
, language
, text
), language
, physical
, markAsCopy
);
47 public PsiFile
createFileFromText(@NotNull String name
,
48 @NotNull FileType fileType
,
49 @NotNull CharSequence text
,
50 long modificationStamp
,
51 final boolean physical
,
53 final LightVirtualFile virtualFile
= new LightVirtualFile(name
, fileType
, text
, modificationStamp
);
54 if(fileType
instanceof LanguageFileType
){
55 final Language language
=
56 LanguageSubstitutors
.INSTANCE
.substituteLanguage(((LanguageFileType
)fileType
).getLanguage(), virtualFile
, myManager
.getProject());
57 final PsiFile file
= trySetupPsiForFile(virtualFile
, language
, physical
, markAsCopy
);
58 if (file
!= null) return file
;
60 final SingleRootFileViewProvider singleRootFileViewProvider
=
61 new SingleRootFileViewProvider(myManager
, virtualFile
, physical
);
62 final PsiPlainTextFileImpl plainTextFile
= new PsiPlainTextFileImpl(singleRootFileViewProvider
);
63 if(markAsCopy
) CodeEditUtil
.setNodeGenerated(plainTextFile
.getNode(), true);
68 private PsiFile
trySetupPsiForFile(final LightVirtualFile virtualFile
, Language language
,
69 final boolean physical
, final boolean markAsCopy
) {
70 final FileViewProviderFactory factory
= LanguageFileViewProviders
.INSTANCE
.forLanguage(language
);
71 FileViewProvider viewProvider
= factory
!= null ? factory
.createFileViewProvider(virtualFile
, language
, myManager
, physical
) : null;
72 if (viewProvider
== null) viewProvider
= new SingleRootFileViewProvider(myManager
, virtualFile
, physical
);
74 language
= viewProvider
.getBaseLanguage();
75 final ParserDefinition parserDefinition
= LanguageParserDefinitions
.INSTANCE
.forLanguage(language
);
76 if (parserDefinition
!= null) {
77 final PsiFile psiFile
= viewProvider
.getPsi(language
);
78 if (psiFile
!= null) {
80 final TreeElement node
= (TreeElement
)psiFile
.getNode();
82 node
.acceptTree(new GeneratedMarkerVisitor());
91 public PsiFile
createFileFromText(@NotNull String name
,
92 @NotNull FileType fileType
, final Language language
, @NotNull Language targetLanguage
, @NotNull CharSequence text
,
93 long modificationStamp
,
94 final boolean physical
,
96 final LightVirtualFile virtualFile
= new LightVirtualFile(name
, fileType
, text
, modificationStamp
);
98 final ParserDefinition parserDefinition
= LanguageParserDefinitions
.INSTANCE
.forLanguage(language
);
99 final FileViewProviderFactory factory
= LanguageFileViewProviders
.INSTANCE
.forLanguage(language
);
100 FileViewProvider viewProvider
= factory
!= null ? factory
.createFileViewProvider(virtualFile
, language
, myManager
, physical
) : null;
101 if (viewProvider
== null) viewProvider
= new SingleRootFileViewProvider(myManager
, virtualFile
, physical
);
103 if (parserDefinition
!= null){
104 final PsiFile psiFile
= viewProvider
.getPsi(targetLanguage
);
105 if (psiFile
!= null) {
107 final TreeElement node
= (TreeElement
)psiFile
.getNode();
109 node
.acceptTree(new GeneratedMarkerVisitor());
115 final SingleRootFileViewProvider singleRootFileViewProvider
=
116 new SingleRootFileViewProvider(myManager
, virtualFile
, physical
);
117 final PsiPlainTextFileImpl plainTextFile
= new PsiPlainTextFileImpl(singleRootFileViewProvider
);
118 if(markAsCopy
) CodeEditUtil
.setNodeGenerated(plainTextFile
.getNode(), true);
119 return plainTextFile
;
123 public PsiFile
createFileFromText(@NotNull String name
, @NotNull FileType fileType
, @NotNull CharSequence text
) {
124 return createFileFromText(name
, fileType
, text
, LocalTimeCounter
.currentTime(), false);
128 public PsiFile
createFileFromText(@NotNull String name
, @NotNull String text
){
129 FileTypeManager fileTypeManager
= FileTypeManager
.getInstance();
130 FileType type
= fileTypeManager
.getFileTypeByFileName(name
);
131 if (type
.isBinary()) {
132 throw new RuntimeException("Cannot create binary files from text");
135 return createFileFromText(name
, type
, text
);
138 public PsiFile
createFileFromText(FileType fileType
, final String fileName
, CharSequence chars
, int startOffset
, int endOffset
) {
139 LOG
.assertTrue(!fileType
.isBinary());
140 final CharSequence text
= startOffset
== 0 && endOffset
== chars
.length()?chars
:new CharSequenceSubSequence(chars
, startOffset
, endOffset
);
141 return createFileFromText(fileName
, fileType
, text
);
146 public PsiFile
createFileFromText(@NotNull CharSequence chars
, @NotNull PsiFile original
) {
147 final PsiFile file
= createFileFromText(original
.getName(), original
.getLanguage(), chars
, false, true);
149 file
.putUserData(ORIGINAL_FILE
, original
);