From a8aab98101d204f60f292ed0d17fe95465233e5f Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Wed, 26 Jan 2005 13:43:03 +0300 Subject: [PATCH] PsiFile factory stuff moved from FileType to Language's ParserDefinition. --- .../com/intellij/lang/ParserDefinition.java | 6 ++ .../intellij/openapi/fileTypes/FileType.java | 8 -- .../openapi/fileTypes/StdFileTypes.java | 16 ++-- .../ide/highlighter/ArchiveFileType.java | 12 --- .../intellij/ide/highlighter/DTDFileType.java | 13 --- .../ide/highlighter/GuiFormFileType.java | 12 --- .../ide/highlighter/HtmlFileType.java | 12 --- .../ide/highlighter/JavaClassFileType.java | 25 ------ .../ide/highlighter/JavaFileType.java | 17 ---- .../ide/highlighter/ModuleFileType.java | 12 --- .../ide/highlighter/ProjectFileType.java | 12 --- .../ide/highlighter/UnknownFileType.java | 9 -- .../ide/highlighter/WorkspaceFileType.java | 12 --- .../ide/highlighter/XHtmlFileType.java | 13 --- .../intellij/ide/highlighter/XmlFileType.java | 12 --- source/com/intellij/lang/dtd/DTDLanguage.java | 4 + .../lang/dtd/DTDParserDefinition.java | 55 ++++++++++++ .../com/intellij/lang/html/HTMLLanguage.java | 7 +- .../lang/html/HTMLParserDefinition.java | 55 ++++++++++++ .../intellij/lang/impl/PsiBuilderImpl.java | 16 +++- .../com/intellij/lang/java/JavaLanguage.java | 5 ++ .../lang/java/JavaParserDefinition.java | 63 +++++++++++++ .../intellij/lang/xhtml/XHTMLLanguage.java | 9 +- .../lang/xhtml/XHTMLParserDefinition.java | 55 ++++++++++++ source/com/intellij/lang/xml/XMLLanguage.java | 5 ++ .../lang/xml/XMLParserDefinition.java | 55 ++++++++++++ .../openapi/fileTypes/PlainTextFileType.java | 12 --- .../openapi/fileTypes/UserBinaryFileType.java | 12 --- .../openapi/fileTypes/ex/FakeFileType.java | 9 -- .../psi/impl/PsiElementFactoryImpl.java | 27 +++--- .../psi/impl/file/impl/FileManagerImpl.java | 42 +++++---- .../psi/impl/source/PsiCodeFragmentImpl.java | 11 +-- .../source/PsiExpressionCodeFragmentImpl.java | 15 ++-- .../intellij/psi/impl/source/PsiFileImpl.java | 90 ++++++++++--------- .../psi/impl/source/PsiJavaFileBaseImpl.java | 22 +++-- .../psi/impl/source/PsiJavaFileImpl.java | 10 +-- .../psi/impl/source/PsiPlainTextFileImpl.java | 14 ++- .../impl/source/PsiTypeCodeFragmentImpl.java | 10 +-- .../source/codeStyle/CodeFormatterFacade.java | 3 +- .../psi/impl/source/html/HtmlFileImpl.java | 24 ++--- .../impl/source/text/BlockSupportImpl.java | 5 +- .../psi/impl/source/tree/FileElement.java | 6 +- .../psi/impl/source/xml/XmlFileImpl.java | 36 +++----- .../psi/impl/source/xml/XmlTextImpl.java | 32 +++---- 44 files changed, 504 insertions(+), 396 deletions(-) create mode 100644 source/com/intellij/lang/dtd/DTDParserDefinition.java create mode 100644 source/com/intellij/lang/html/HTMLParserDefinition.java create mode 100644 source/com/intellij/lang/java/JavaParserDefinition.java create mode 100644 source/com/intellij/lang/xhtml/XHTMLParserDefinition.java create mode 100644 source/com/intellij/lang/xml/XMLParserDefinition.java diff --git a/openapi/src/com/intellij/lang/ParserDefinition.java b/openapi/src/com/intellij/lang/ParserDefinition.java index e2448ac83f68..17f16b8f67af 100644 --- a/openapi/src/com/intellij/lang/ParserDefinition.java +++ b/openapi/src/com/intellij/lang/ParserDefinition.java @@ -1,7 +1,10 @@ package com.intellij.lang; import com.intellij.lexer.Lexer; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; @@ -22,4 +25,7 @@ public interface ParserDefinition { PsiParser createParser(); PsiElement createElement(ASTNode node); + + PsiFile createFile(Project project, VirtualFile file); + PsiFile createFile(Project project, String name, CharSequence text); } diff --git a/openapi/src/com/intellij/openapi/fileTypes/FileType.java b/openapi/src/com/intellij/openapi/fileTypes/FileType.java index 34f8e729bdf2..3b542b6415a9 100644 --- a/openapi/src/com/intellij/openapi/fileTypes/FileType.java +++ b/openapi/src/com/intellij/openapi/fileTypes/FileType.java @@ -5,10 +5,8 @@ package com.intellij.openapi.fileTypes; import com.intellij.ide.structureView.StructureViewModel; -import com.intellij.lang.Language; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; import javax.swing.*; @@ -31,13 +29,7 @@ public interface FileType { SyntaxHighlighter getHighlighter(Project project); - PsiFile createPsiFile(VirtualFile file, Project project); - - PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset); - FileTypeSupportCapabilities getSupportCapabilities(); StructureViewModel getStructureViewModel(VirtualFile file, Project project); - - Language getLanguage(); } diff --git a/openapi/src/com/intellij/openapi/fileTypes/StdFileTypes.java b/openapi/src/com/intellij/openapi/fileTypes/StdFileTypes.java index e0b0d5b36ee8..1a26c7812d4c 100644 --- a/openapi/src/com/intellij/openapi/fileTypes/StdFileTypes.java +++ b/openapi/src/com/intellij/openapi/fileTypes/StdFileTypes.java @@ -32,18 +32,18 @@ package com.intellij.openapi.fileTypes; public class StdFileTypes { - public static FileType JAVA; + public static LanguageFileType JAVA; public static FileType CLASS; - public static FileType JSP; - public static FileType JSPX; - public static FileType XML; - public static FileType DTD; - public static FileType HTML; - public static FileType XHTML; + public static LanguageFileType JSP; + public static LanguageFileType JSPX; + public static LanguageFileType XML; + public static LanguageFileType DTD; + public static LanguageFileType HTML; + public static LanguageFileType XHTML; + public static LanguageFileType ASPECT; public static FileType PLAIN_TEXT; public static FileType ARCHIVE; public static FileType UNKNOWN; - public static FileType ASPECT; public static FileType GUI_DESIGNER_FORM; public static FileType IDEA_WORKSPACE; public static FileType IDEA_PROJECT; diff --git a/source/com/intellij/ide/highlighter/ArchiveFileType.java b/source/com/intellij/ide/highlighter/ArchiveFileType.java index c69cebc86462..74df096b4830 100644 --- a/source/com/intellij/ide/highlighter/ArchiveFileType.java +++ b/source/com/intellij/ide/highlighter/ArchiveFileType.java @@ -39,10 +39,6 @@ import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.file.PsiBinaryFileImpl; import javax.swing.*; @@ -81,14 +77,6 @@ public class ArchiveFileType implements FileType { return null; } - public PsiFile createPsiFile(VirtualFile file, Project project) { - return new PsiBinaryFileImpl((PsiManagerImpl)PsiManager.getInstance(project), file); - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return null; - } - public FileTypeSupportCapabilities getSupportCapabilities() { return null; } diff --git a/source/com/intellij/ide/highlighter/DTDFileType.java b/source/com/intellij/ide/highlighter/DTDFileType.java index f97ca7a1ba17..47233967564b 100644 --- a/source/com/intellij/ide/highlighter/DTDFileType.java +++ b/source/com/intellij/ide/highlighter/DTDFileType.java @@ -35,14 +35,9 @@ import com.intellij.ide.structureView.StructureViewModel; import com.intellij.lang.dtd.DTDLanguage; import com.intellij.openapi.fileTypes.FileTypeSupportCapabilities; import com.intellij.openapi.fileTypes.LanguageFileType; -import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.source.xml.XmlFileImpl; import javax.swing.*; @@ -69,14 +64,6 @@ public class DTDFileType extends LanguageFileType { return ICON; } - public PsiFile createPsiFile(VirtualFile file, Project project) { - return new XmlFileImpl((PsiManagerImpl)PsiManager.getInstance(project), file); - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return new XmlFileImpl((PsiManagerImpl)PsiManager.getInstance(project), name, text, startOffset, endOffset, StdFileTypes.DTD); - } - private FileTypeSupportCapabilities mySupportCapabilities = new FileTypeSupportCapabilities() { public boolean hasCompletion() { return false; //To change body of implemented methods use File | Settings | File Templates. diff --git a/source/com/intellij/ide/highlighter/GuiFormFileType.java b/source/com/intellij/ide/highlighter/GuiFormFileType.java index 6dae58072368..46c6a08c65ee 100644 --- a/source/com/intellij/ide/highlighter/GuiFormFileType.java +++ b/source/com/intellij/ide/highlighter/GuiFormFileType.java @@ -39,10 +39,6 @@ import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.source.PsiPlainTextFileImpl; import javax.swing.*; @@ -81,14 +77,6 @@ public class GuiFormFileType implements FileType { return new XmlFileHighlighter(); } - public PsiFile createPsiFile(VirtualFile file, Project project) { - return new PsiPlainTextFileImpl((PsiManagerImpl)PsiManager.getInstance(project), file); - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return new PsiPlainTextFileImpl((PsiManagerImpl)PsiManager.getInstance(project), name, this, text, startOffset, endOffset); - } - public FileTypeSupportCapabilities getSupportCapabilities() { return null; } diff --git a/source/com/intellij/ide/highlighter/HtmlFileType.java b/source/com/intellij/ide/highlighter/HtmlFileType.java index e71c33683891..c39e8da297e5 100644 --- a/source/com/intellij/ide/highlighter/HtmlFileType.java +++ b/source/com/intellij/ide/highlighter/HtmlFileType.java @@ -36,14 +36,10 @@ import com.intellij.ide.structureView.impl.xml.XmlStructureViewTreeModel; import com.intellij.lang.html.HTMLLanguage; import com.intellij.openapi.fileTypes.FileTypeSupportCapabilities; import com.intellij.openapi.fileTypes.LanguageFileType; -import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.source.html.HtmlFileImpl; import com.intellij.psi.xml.XmlFile; import javax.swing.*; @@ -71,14 +67,6 @@ public class HtmlFileType extends LanguageFileType { return ICON; } - public PsiFile createPsiFile(VirtualFile file, Project project) { - return new HtmlFileImpl((PsiManagerImpl)PsiManager.getInstance(project), file); - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return new HtmlFileImpl((PsiManagerImpl)PsiManager.getInstance(project), name, text, startOffset, endOffset, StdFileTypes.HTML); - } - private static FileTypeSupportCapabilities capabilities = new FileTypeSupportCapabilities() { public boolean hasCompletion() { return true; diff --git a/source/com/intellij/ide/highlighter/JavaClassFileType.java b/source/com/intellij/ide/highlighter/JavaClassFileType.java index 28938def9b58..b92d639b5fa9 100644 --- a/source/com/intellij/ide/highlighter/JavaClassFileType.java +++ b/source/com/intellij/ide/highlighter/JavaClassFileType.java @@ -37,15 +37,9 @@ import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeSupportCapabilities; import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectFileIndex; -import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.java.LanguageLevel; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.compiled.ClsFileImpl; import javax.swing.*; @@ -84,25 +78,6 @@ public class JavaClassFileType implements FileType { return new JavaFileHighlighter(LanguageLevel.HIGHEST); } - public PsiFile createPsiFile(VirtualFile file, Project project) { - ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); - if (fileIndex.isInLibraryClasses(file)) { - // skip inners & anonymous - String name = file.getName(); - int dotIndex = name.lastIndexOf('.'); - if (dotIndex < 0) dotIndex = name.length(); - int index = name.lastIndexOf('$', dotIndex); - if (index >= 0) return null; - - return new ClsFileImpl((PsiManagerImpl)PsiManager.getInstance(project), file); - } - return null; - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return null; - } - public FileTypeSupportCapabilities getSupportCapabilities() { return null; } diff --git a/source/com/intellij/ide/highlighter/JavaFileType.java b/source/com/intellij/ide/highlighter/JavaFileType.java index 6b7f158eb299..854644c3a4a8 100644 --- a/source/com/intellij/ide/highlighter/JavaFileType.java +++ b/source/com/intellij/ide/highlighter/JavaFileType.java @@ -37,16 +37,11 @@ import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.fileTypes.FileTypeSupportCapabilities; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectFileIndex; -import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiJavaFile; import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.source.PsiJavaFileImpl; -import com.intellij.psi.impl.source.PsiPlainTextFileImpl; import javax.swing.*; @@ -73,18 +68,6 @@ public class JavaFileType extends LanguageFileType { return ICON; } - public PsiFile createPsiFile(VirtualFile file, Project project) { - ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); - if (fileIndex.isInSource(file)) { - return new PsiJavaFileImpl((PsiManagerImpl)PsiManager.getInstance(project), file); - } - return new PsiPlainTextFileImpl((PsiManagerImpl)PsiManager.getInstance(project), file); - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return new PsiJavaFileImpl((PsiManagerImpl)PsiManager.getInstance(project), name, text, startOffset, endOffset); - } - public FileTypeSupportCapabilities getSupportCapabilities() { return null; } diff --git a/source/com/intellij/ide/highlighter/ModuleFileType.java b/source/com/intellij/ide/highlighter/ModuleFileType.java index c393670744db..05682fdba6e8 100644 --- a/source/com/intellij/ide/highlighter/ModuleFileType.java +++ b/source/com/intellij/ide/highlighter/ModuleFileType.java @@ -39,10 +39,6 @@ import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.source.PsiPlainTextFileImpl; import javax.swing.*; @@ -81,14 +77,6 @@ public class ModuleFileType implements FileType { return new XmlFileHighlighter(); } - public PsiFile createPsiFile(VirtualFile file, Project project) { - return new PsiPlainTextFileImpl((PsiManagerImpl)PsiManager.getInstance(project), file); - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return new PsiPlainTextFileImpl((PsiManagerImpl)PsiManager.getInstance(project), name, this, text, startOffset, endOffset); - } - public FileTypeSupportCapabilities getSupportCapabilities() { return null; } diff --git a/source/com/intellij/ide/highlighter/ProjectFileType.java b/source/com/intellij/ide/highlighter/ProjectFileType.java index dec1e05c0756..e7b02305d179 100644 --- a/source/com/intellij/ide/highlighter/ProjectFileType.java +++ b/source/com/intellij/ide/highlighter/ProjectFileType.java @@ -39,10 +39,6 @@ import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.source.PsiPlainTextFileImpl; import javax.swing.*; @@ -81,14 +77,6 @@ public class ProjectFileType implements FileType { return new XmlFileHighlighter(); } - public PsiFile createPsiFile(VirtualFile file, Project project) { - return new PsiPlainTextFileImpl((PsiManagerImpl)PsiManager.getInstance(project), file); - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return new PsiPlainTextFileImpl((PsiManagerImpl)PsiManager.getInstance(project), name, this, text, startOffset, endOffset); - } - public FileTypeSupportCapabilities getSupportCapabilities() { return null; } diff --git a/source/com/intellij/ide/highlighter/UnknownFileType.java b/source/com/intellij/ide/highlighter/UnknownFileType.java index eae4ce6049f9..bd4e1629bd68 100644 --- a/source/com/intellij/ide/highlighter/UnknownFileType.java +++ b/source/com/intellij/ide/highlighter/UnknownFileType.java @@ -39,7 +39,6 @@ import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; import javax.swing.*; @@ -78,14 +77,6 @@ public class UnknownFileType implements FileType { return null; } - public PsiFile createPsiFile(VirtualFile file, Project project) { - return null; - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return null; - } - public FileTypeSupportCapabilities getSupportCapabilities() { return null; } diff --git a/source/com/intellij/ide/highlighter/WorkspaceFileType.java b/source/com/intellij/ide/highlighter/WorkspaceFileType.java index 0ad841526fdb..ce1f06fc2738 100644 --- a/source/com/intellij/ide/highlighter/WorkspaceFileType.java +++ b/source/com/intellij/ide/highlighter/WorkspaceFileType.java @@ -39,10 +39,6 @@ import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.source.PsiPlainTextFileImpl; import javax.swing.*; @@ -81,14 +77,6 @@ public class WorkspaceFileType implements FileType { return new XmlFileHighlighter(); } - public PsiFile createPsiFile(VirtualFile file, Project project) { - return new PsiPlainTextFileImpl((PsiManagerImpl)PsiManager.getInstance(project), file); - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return new PsiPlainTextFileImpl((PsiManagerImpl)PsiManager.getInstance(project), name, this, text, startOffset, endOffset); - } - public FileTypeSupportCapabilities getSupportCapabilities() { return null; } diff --git a/source/com/intellij/ide/highlighter/XHtmlFileType.java b/source/com/intellij/ide/highlighter/XHtmlFileType.java index 5fd2e4257c01..d3395f28c939 100644 --- a/source/com/intellij/ide/highlighter/XHtmlFileType.java +++ b/source/com/intellij/ide/highlighter/XHtmlFileType.java @@ -35,14 +35,9 @@ import com.intellij.ide.structureView.StructureViewModel; import com.intellij.lang.xhtml.XHTMLLanguage; import com.intellij.openapi.fileTypes.FileTypeSupportCapabilities; import com.intellij.openapi.fileTypes.LanguageFileType; -import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.source.xml.XmlFileImpl; import javax.swing.*; @@ -69,14 +64,6 @@ public class XHtmlFileType extends LanguageFileType { return ICON; } - public PsiFile createPsiFile(VirtualFile file, Project project) { - return new XmlFileImpl((PsiManagerImpl)PsiManager.getInstance(project), file); - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return new XmlFileImpl((PsiManagerImpl)PsiManager.getInstance(project), name, text, startOffset, endOffset, StdFileTypes.XHTML); - } - private static FileTypeSupportCapabilities capabilities = new FileTypeSupportCapabilities() { public boolean hasCompletion() { return true; diff --git a/source/com/intellij/ide/highlighter/XmlFileType.java b/source/com/intellij/ide/highlighter/XmlFileType.java index b29ab249442e..342db5a64c69 100644 --- a/source/com/intellij/ide/highlighter/XmlFileType.java +++ b/source/com/intellij/ide/highlighter/XmlFileType.java @@ -36,14 +36,10 @@ import com.intellij.ide.structureView.impl.xml.XmlStructureViewTreeModel; import com.intellij.lang.xml.XMLLanguage; import com.intellij.openapi.fileTypes.FileTypeSupportCapabilities; import com.intellij.openapi.fileTypes.LanguageFileType; -import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.source.xml.XmlFileImpl; import com.intellij.psi.xml.XmlFile; import javax.swing.*; @@ -71,14 +67,6 @@ public class XmlFileType extends LanguageFileType { return ICON; } - public PsiFile createPsiFile(VirtualFile file, Project project) { - return new XmlFileImpl((PsiManagerImpl)PsiManager.getInstance(project), file); - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return new XmlFileImpl((PsiManagerImpl)PsiManager.getInstance(project), name, text, startOffset, endOffset, StdFileTypes.XML); - } - public FileTypeSupportCapabilities getSupportCapabilities() { return null; } diff --git a/source/com/intellij/lang/dtd/DTDLanguage.java b/source/com/intellij/lang/dtd/DTDLanguage.java index a8b3e533f4d9..2d08e064e786 100644 --- a/source/com/intellij/lang/dtd/DTDLanguage.java +++ b/source/com/intellij/lang/dtd/DTDLanguage.java @@ -2,6 +2,7 @@ package com.intellij.lang.dtd; import com.intellij.ide.highlighter.XmlFileHighlighter; import com.intellij.lang.Language; +import com.intellij.lang.ParserDefinition; import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.project.Project; @@ -22,4 +23,7 @@ public class DTDLanguage extends Language { return new XmlFileHighlighter(true); } + public ParserDefinition getParserDefinition(Project project) { + return new DTDParserDefinition(); + } } diff --git a/source/com/intellij/lang/dtd/DTDParserDefinition.java b/source/com/intellij/lang/dtd/DTDParserDefinition.java new file mode 100644 index 000000000000..41f6b53bf8f1 --- /dev/null +++ b/source/com/intellij/lang/dtd/DTDParserDefinition.java @@ -0,0 +1,55 @@ +package com.intellij.lang.dtd; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.ParserDefinition; +import com.intellij.lang.PsiParser; +import com.intellij.lexer.Lexer; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.impl.source.xml.XmlFileImpl; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; + +/** + * Created by IntelliJ IDEA. + * User: max + * Date: Jan 26, 2005 + * Time: 12:43:27 PM + * To change this template use File | Settings | File Templates. + */ +public class DTDParserDefinition implements ParserDefinition { + public Lexer createLexer() { + return null; + } + + public IElementType getFileNodeType() { + return null; + } + + public TokenSet getWhitespaceTokens() { + return null; + } + + public TokenSet getCommentTokens() { + return null; + } + + public PsiParser createParser() { + return null; + } + + public PsiElement createElement(ASTNode node) { + return null; + } + + public PsiFile createFile(Project project, VirtualFile file) { + return new XmlFileImpl(project, file); + } + + public PsiFile createFile(Project project, String name, CharSequence text) { + return new XmlFileImpl(project, name, text, StdFileTypes.DTD); + } +} diff --git a/source/com/intellij/lang/html/HTMLLanguage.java b/source/com/intellij/lang/html/HTMLLanguage.java index f4d8dfb8157c..bb072a3e133e 100644 --- a/source/com/intellij/lang/html/HTMLLanguage.java +++ b/source/com/intellij/lang/html/HTMLLanguage.java @@ -3,12 +3,11 @@ package com.intellij.lang.html; import com.intellij.codeFormatting.PseudoTextBuilder; import com.intellij.codeFormatting.xml.html.HtmlPseudoTextBuilder; import com.intellij.ide.highlighter.HtmlFileHighlighter; -import com.intellij.lang.Language; +import com.intellij.lang.ParserDefinition; import com.intellij.lang.xml.XMLLanguage; import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.project.Project; import com.intellij.psi.impl.source.xml.XmlPsiPolicy; -import com.intellij.psi.impl.source.xml.behavior.EncodeEachSymbolPolicy; /** * Created by IntelliJ IDEA. @@ -33,4 +32,8 @@ public class HTMLLanguage extends XMLLanguage { public XmlPsiPolicy getPsiPolicy() { return ENCODE_EACH_SYMBOL_POLICY; } + + public ParserDefinition getParserDefinition(Project project) { + return new HTMLParserDefinition(); + } } diff --git a/source/com/intellij/lang/html/HTMLParserDefinition.java b/source/com/intellij/lang/html/HTMLParserDefinition.java new file mode 100644 index 000000000000..4ad98593e770 --- /dev/null +++ b/source/com/intellij/lang/html/HTMLParserDefinition.java @@ -0,0 +1,55 @@ +package com.intellij.lang.html; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.ParserDefinition; +import com.intellij.lang.PsiParser; +import com.intellij.lexer.Lexer; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.impl.source.html.HtmlFileImpl; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; + +/** + * Created by IntelliJ IDEA. + * User: max + * Date: Jan 26, 2005 + * Time: 1:01:36 PM + * To change this template use File | Settings | File Templates. + */ +public class HTMLParserDefinition implements ParserDefinition { + public Lexer createLexer() { + return null; + } + + public IElementType getFileNodeType() { + return null; + } + + public TokenSet getWhitespaceTokens() { + return null; + } + + public TokenSet getCommentTokens() { + return null; + } + + public PsiParser createParser() { + return null; + } + + public PsiElement createElement(ASTNode node) { + return null; + } + + public PsiFile createFile(Project project, VirtualFile file) { + return new HtmlFileImpl(project, file); + } + + public PsiFile createFile(Project project, String name, CharSequence text) { + return new HtmlFileImpl(project, name, text, StdFileTypes.HTML); + } +} diff --git a/source/com/intellij/lang/impl/PsiBuilderImpl.java b/source/com/intellij/lang/impl/PsiBuilderImpl.java index 3ea175c5d241..6677fd35d2c4 100644 --- a/source/com/intellij/lang/impl/PsiBuilderImpl.java +++ b/source/com/intellij/lang/impl/PsiBuilderImpl.java @@ -25,13 +25,15 @@ public class PsiBuilderImpl implements PsiBuilder { private List myProduction = new ArrayList(); private Lexer myLexer; + private boolean myFileLevelParsing; private int myCurrentLexem; private CharTable myCharTable; private boolean myStarted = false; - public PsiBuilderImpl(final Lexer lexer, final CharTable charTable) { + public PsiBuilderImpl(final Lexer lexer, final CharTable charTable, boolean fileLevelParsing) { myCharTable = charTable; myLexer = lexer; + myFileLevelParsing = fileLevelParsing; } private static class MarkerImpl implements Marker { @@ -165,8 +167,16 @@ public class PsiBuilderImpl implements PsiBuilder { public ASTNode getTreeBuilt() { MarkerImpl rootMarker = (MarkerImpl)myProduction.get(0); - ASTNode rootNode = new CompositeElement(rootMarker.myType); - rootNode.putUserData(CharTable.CHAR_TABLE_KEY, myCharTable); + + final ASTNode rootNode; + if (myFileLevelParsing) { + rootNode = new FileElement(rootMarker.myType); + myCharTable = ((FileElement)rootNode).getCharTable(); + } + else { + rootNode = new CompositeElement(rootMarker.myType); + rootNode.putUserData(CharTable.CHAR_TABLE_KEY, myCharTable); + } ASTNode curNode = rootNode; for (int i = 1; i < myProduction.size(); i++) { diff --git a/source/com/intellij/lang/java/JavaLanguage.java b/source/com/intellij/lang/java/JavaLanguage.java index d42e81877fd6..b678c5ced904 100644 --- a/source/com/intellij/lang/java/JavaLanguage.java +++ b/source/com/intellij/lang/java/JavaLanguage.java @@ -3,6 +3,7 @@ package com.intellij.lang.java; import com.intellij.codeFormatting.PseudoTextBuilder; import com.intellij.ide.highlighter.JavaFileHighlighter; import com.intellij.lang.Language; +import com.intellij.lang.ParserDefinition; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.fileTypes.SyntaxHighlighter; @@ -35,4 +36,8 @@ public class JavaLanguage extends Language { } }; } + + public ParserDefinition getParserDefinition(Project project) { + return new JavaParserDefinition(); + } } diff --git a/source/com/intellij/lang/java/JavaParserDefinition.java b/source/com/intellij/lang/java/JavaParserDefinition.java new file mode 100644 index 000000000000..99e459c9a722 --- /dev/null +++ b/source/com/intellij/lang/java/JavaParserDefinition.java @@ -0,0 +1,63 @@ +package com.intellij.lang.java; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.ParserDefinition; +import com.intellij.lang.PsiParser; +import com.intellij.lexer.Lexer; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.impl.source.PsiJavaFileImpl; +import com.intellij.psi.impl.source.PsiPlainTextFileImpl; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; + +/** + * Created by IntelliJ IDEA. + * User: max + * Date: Jan 26, 2005 + * Time: 12:40:22 PM + * To change this template use File | Settings | File Templates. + */ +public class JavaParserDefinition implements ParserDefinition { + public Lexer createLexer() { + return null; + } + + public IElementType getFileNodeType() { + return null; + } + + public TokenSet getWhitespaceTokens() { + return null; + } + + public TokenSet getCommentTokens() { + return null; + } + + public PsiParser createParser() { + return null; + } + + public PsiElement createElement(ASTNode node) { + return null; + } + + public PsiFile createFile(Project project, VirtualFile file) { + ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + if (fileIndex.isInSource(file)) { + return new PsiJavaFileImpl(project, file); + } + else { + return new PsiPlainTextFileImpl(project, file); + } + } + + public PsiFile createFile(Project project, String name, CharSequence text) { + return new PsiJavaFileImpl(project, name, text); + } +} diff --git a/source/com/intellij/lang/xhtml/XHTMLLanguage.java b/source/com/intellij/lang/xhtml/XHTMLLanguage.java index 52623b0f210c..22573c413c09 100644 --- a/source/com/intellij/lang/xhtml/XHTMLLanguage.java +++ b/source/com/intellij/lang/xhtml/XHTMLLanguage.java @@ -1,11 +1,11 @@ package com.intellij.lang.xhtml; +import com.intellij.codeFormatting.PseudoTextBuilder; import com.intellij.ide.highlighter.XmlFileHighlighter; -import com.intellij.lang.Language; +import com.intellij.lang.ParserDefinition; import com.intellij.lang.xml.XMLLanguage; import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.project.Project; -import com.intellij.codeFormatting.PseudoTextBuilder; import com.intellij.psi.impl.source.xml.XmlPsiPolicy; /** @@ -27,7 +27,12 @@ public class XHTMLLanguage extends XMLLanguage { public PseudoTextBuilder getFormatter() { return null; } + public XmlPsiPolicy getPsiPolicy() { return ENCODE_EACH_SYMBOL_POLICY; } + + public ParserDefinition getParserDefinition(Project project) { + return new XHTMLParserDefinition(); + } } diff --git a/source/com/intellij/lang/xhtml/XHTMLParserDefinition.java b/source/com/intellij/lang/xhtml/XHTMLParserDefinition.java new file mode 100644 index 000000000000..53d00e17ed0e --- /dev/null +++ b/source/com/intellij/lang/xhtml/XHTMLParserDefinition.java @@ -0,0 +1,55 @@ +package com.intellij.lang.xhtml; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.ParserDefinition; +import com.intellij.lang.PsiParser; +import com.intellij.lexer.Lexer; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.impl.source.xml.XmlFileImpl; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; + +/** + * Created by IntelliJ IDEA. + * User: max + * Date: Jan 26, 2005 + * Time: 1:02:53 PM + * To change this template use File | Settings | File Templates. + */ +public class XHTMLParserDefinition implements ParserDefinition { + public Lexer createLexer() { + return null; + } + + public IElementType getFileNodeType() { + return null; + } + + public TokenSet getWhitespaceTokens() { + return null; + } + + public TokenSet getCommentTokens() { + return null; + } + + public PsiParser createParser() { + return null; + } + + public PsiElement createElement(ASTNode node) { + return null; + } + + public PsiFile createFile(Project project, VirtualFile file) { + return new XmlFileImpl(project, file); + } + + public PsiFile createFile(Project project, String name, CharSequence text) { + return new XmlFileImpl(project, name, text, StdFileTypes.XHTML); + } +} diff --git a/source/com/intellij/lang/xml/XMLLanguage.java b/source/com/intellij/lang/xml/XMLLanguage.java index 51da43a5cfb1..35df4956cda1 100644 --- a/source/com/intellij/lang/xml/XMLLanguage.java +++ b/source/com/intellij/lang/xml/XMLLanguage.java @@ -4,6 +4,7 @@ import com.intellij.codeFormatting.PseudoTextBuilder; import com.intellij.codeFormatting.xml.xml.XmlPseudoTextBuilder; import com.intellij.ide.highlighter.XmlFileHighlighter; import com.intellij.lang.Language; +import com.intellij.lang.ParserDefinition; import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.project.Project; import com.intellij.psi.impl.source.xml.XmlPsiPolicy; @@ -41,4 +42,8 @@ public class XMLLanguage extends Language { public XmlPsiPolicy getPsiPolicy(){ return CDATA_ON_ANY_ENCODED_POLICY; } + + public ParserDefinition getParserDefinition(Project project) { + return new XMLParserDefinition(); + } } diff --git a/source/com/intellij/lang/xml/XMLParserDefinition.java b/source/com/intellij/lang/xml/XMLParserDefinition.java new file mode 100644 index 000000000000..89834d933440 --- /dev/null +++ b/source/com/intellij/lang/xml/XMLParserDefinition.java @@ -0,0 +1,55 @@ +package com.intellij.lang.xml; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.ParserDefinition; +import com.intellij.lang.PsiParser; +import com.intellij.lexer.Lexer; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.impl.source.xml.XmlFileImpl; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.tree.TokenSet; + +/** + * Created by IntelliJ IDEA. + * User: max + * Date: Jan 26, 2005 + * Time: 1:00:32 PM + * To change this template use File | Settings | File Templates. + */ +public class XMLParserDefinition implements ParserDefinition { + public Lexer createLexer() { + return null; + } + + public IElementType getFileNodeType() { + return null; + } + + public TokenSet getWhitespaceTokens() { + return null; + } + + public TokenSet getCommentTokens() { + return null; + } + + public PsiParser createParser() { + return null; + } + + public PsiElement createElement(ASTNode node) { + return null; + } + + public PsiFile createFile(Project project, VirtualFile file) { + return new XmlFileImpl(project, file); + } + + public PsiFile createFile(Project project, String name, CharSequence text) { + return new XmlFileImpl(project, name, text, StdFileTypes.XML); + } +} diff --git a/source/com/intellij/openapi/fileTypes/PlainTextFileType.java b/source/com/intellij/openapi/fileTypes/PlainTextFileType.java index 68dd5e94a660..efd27cae638e 100644 --- a/source/com/intellij/openapi/fileTypes/PlainTextFileType.java +++ b/source/com/intellij/openapi/fileTypes/PlainTextFileType.java @@ -36,10 +36,6 @@ import com.intellij.lang.Language; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.source.PsiPlainTextFileImpl; import javax.swing.*; @@ -78,14 +74,6 @@ public class PlainTextFileType implements FileType { return new PlainSyntaxHighlighter(); } - public PsiFile createPsiFile(VirtualFile file, Project project) { - return new PsiPlainTextFileImpl((PsiManagerImpl)PsiManager.getInstance(project), file); - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return new PsiPlainTextFileImpl((PsiManagerImpl)PsiManager.getInstance(project), name, this, text, startOffset, endOffset); - } - public FileTypeSupportCapabilities getSupportCapabilities() { return null; } diff --git a/source/com/intellij/openapi/fileTypes/UserBinaryFileType.java b/source/com/intellij/openapi/fileTypes/UserBinaryFileType.java index 6e8706fec725..5aa36156c06f 100644 --- a/source/com/intellij/openapi/fileTypes/UserBinaryFileType.java +++ b/source/com/intellij/openapi/fileTypes/UserBinaryFileType.java @@ -33,11 +33,6 @@ package com.intellij.openapi.fileTypes; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.file.PsiBinaryFileImpl; public class UserBinaryFileType extends UserFileType { public SettingsEditor getEditor() { @@ -52,11 +47,4 @@ public class UserBinaryFileType extends UserFileType { return null; } - public PsiFile createPsiFile(VirtualFile file, Project project) { - return new PsiBinaryFileImpl((PsiManagerImpl)PsiManager.getInstance(project), file); - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return null; - } } \ No newline at end of file diff --git a/source/com/intellij/openapi/fileTypes/ex/FakeFileType.java b/source/com/intellij/openapi/fileTypes/ex/FakeFileType.java index d848e7923912..9a8f3c6dfbcf 100644 --- a/source/com/intellij/openapi/fileTypes/ex/FakeFileType.java +++ b/source/com/intellij/openapi/fileTypes/ex/FakeFileType.java @@ -12,7 +12,6 @@ import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeSupportCapabilities; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiFile; import javax.swing.*; @@ -39,14 +38,6 @@ public abstract class FakeFileType implements FileType { return null; } - public PsiFile createPsiFile(VirtualFile file, Project project) { - return null; - } - - public PsiFile createPsiFile(Project project, String name, char[] text, int startOffset, int endOffset) { - return null; - } - public FileTypeSupportCapabilities getSupportCapabilities() { return null; } diff --git a/source/com/intellij/psi/impl/PsiElementFactoryImpl.java b/source/com/intellij/psi/impl/PsiElementFactoryImpl.java index 1f48c0b35205..ae66a05ee07a 100644 --- a/source/com/intellij/psi/impl/PsiElementFactoryImpl.java +++ b/source/com/intellij/psi/impl/PsiElementFactoryImpl.java @@ -6,10 +6,13 @@ import com.intellij.aspects.psi.PsiWithinPointcut; import com.intellij.ide.fileTemplates.FileTemplate; import com.intellij.ide.fileTemplates.FileTemplateManager; import com.intellij.ide.fileTemplates.FileTemplateUtil; +import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeManager; +import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.project.Project; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; @@ -28,9 +31,9 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.psi.xml.*; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashMap; +import com.intellij.util.text.CharArrayCharSequence; import com.intellij.xml.util.XmlTagTextUtil; import com.intellij.xml.util.XmlUtil; -import com.intellij.lang.ASTNode; import java.util.Iterator; import java.util.Map; @@ -609,8 +612,12 @@ public class PsiElementFactoryImpl implements PsiElementFactory { int startOffset, int endOffset) { LOG.assertTrue(!fileType.isBinary()); - PsiFile psiFile = fileType.createPsiFile(manager.getProject(), name, chars, startOffset, endOffset); - return psiFile != null ? psiFile : new PsiPlainTextFileImpl(manager, name, fileType, chars, startOffset, endOffset); + final Project project = manager.getProject(); + final CharArrayCharSequence text = new CharArrayCharSequence(chars, startOffset, endOffset); + if (fileType instanceof LanguageFileType) { + return ((LanguageFileType)fileType).getLanguage().getParserDefinition(project).createFile(project, name, text); + } + return new PsiPlainTextFileImpl(project, name, fileType, text); } public PsiClass createClassFromText(String text, PsiElement context) throws IncorrectOperationException { @@ -751,19 +758,17 @@ public class PsiElementFactoryImpl implements PsiElementFactory { public PsiExpressionCodeFragment createExpressionCodeFragment(String text, PsiElement context, boolean isPhysical) { final PsiExpressionCodeFragmentImpl result = new PsiExpressionCodeFragmentImpl( - myManager, isPhysical, "fragment.java", text.toCharArray(), 0, text.length()); + myManager.getProject(), isPhysical, "fragment.java", text); result.setContext(context); return result; } public PsiCodeFragment createCodeBlockCodeFragment(String text, PsiElement context, boolean isPhysical) { - final PsiCodeFragmentImpl result = new PsiCodeFragmentImpl(myManager, + final PsiCodeFragmentImpl result = new PsiCodeFragmentImpl(myManager.getProject(), ElementType.STATEMENTS, isPhysical, "fragment.java", - text.toCharArray(), - 0, - text.length()); + text); result.setContext(context); return result; } @@ -786,13 +791,11 @@ public class PsiElementFactoryImpl implements PsiElementFactory { boolean isVoidValid, boolean isPhysical, boolean allowEllipsis) { - final PsiTypeCodeFragmentImpl result = new PsiTypeCodeFragmentImpl(myManager, + final PsiTypeCodeFragmentImpl result = new PsiTypeCodeFragmentImpl(myManager.getProject(), isPhysical, allowEllipsis, "fragment.java", - text.toCharArray(), - 0, - text.length()); + text); result.setContext(context); if (isVoidValid) { result.putUserData(PsiUtil.VALID_VOID_TYPE_IN_CODE_FRAGMENT, Boolean.TRUE); diff --git a/source/com/intellij/psi/impl/file/impl/FileManagerImpl.java b/source/com/intellij/psi/impl/file/impl/FileManagerImpl.java index ce0fc00e1847..cb8e7543f873 100644 --- a/source/com/intellij/psi/impl/file/impl/FileManagerImpl.java +++ b/source/com/intellij/psi/impl/file/impl/FileManagerImpl.java @@ -1,18 +1,17 @@ package com.intellij.psi.impl.file.impl; import com.intellij.ide.highlighter.JavaClassFileType; +import com.intellij.lang.Language; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileDocumentManagerAdapter; import com.intellij.openapi.fileEditor.FileDocumentManagerListener; -import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.fileTypes.FileTypeEvent; -import com.intellij.openapi.fileTypes.FileTypeListener; -import com.intellij.openapi.fileTypes.FileTypeManager; +import com.intellij.openapi.fileTypes.*; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.*; import com.intellij.openapi.vfs.*; import com.intellij.psi.*; @@ -346,19 +345,30 @@ public class FileManagerImpl implements FileManager { if (psiDir == null) return null; FileType fileType = myFileTypeManager.getFileTypeByFileName(name); - PsiFile psiFile = fileType.createPsiFile(vFile, myManager.getProject()); - if (psiFile == null) { - // a bit hacky. - if (fileType instanceof JavaClassFileType) return null; - - if (fileType.isBinary()) { - psiFile = new PsiBinaryFileImpl(myManager, vFile); - } - else { - psiFile = new PsiPlainTextFileImpl(myManager, vFile); - } + final Project project = myManager.getProject(); + if (fileType instanceof LanguageFileType) { + final Language language = ((LanguageFileType)fileType).getLanguage(); + return language.getParserDefinition(project).createFile(project, vFile); } - return psiFile; + + if (fileType instanceof JavaClassFileType) { + ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + if (fileIndex.isInLibraryClasses(vFile)) { + // skip inners & anonymous + int dotIndex = name.lastIndexOf('.'); + if (dotIndex < 0) dotIndex = name.length(); + int index = name.lastIndexOf('$', dotIndex); + if (index >= 0) return null; + + return new ClsFileImpl((PsiManagerImpl)PsiManager.getInstance(project), vFile); + } + return null; + } + + if (fileType.isBinary()) { + return new PsiBinaryFileImpl(myManager, vFile); + } + return new PsiPlainTextFileImpl(project, vFile); } public PsiDirectory findDirectory(VirtualFile vFile) { diff --git a/source/com/intellij/psi/impl/source/PsiCodeFragmentImpl.java b/source/com/intellij/psi/impl/source/PsiCodeFragmentImpl.java index 4c50f4935680..a3d966b02786 100644 --- a/source/com/intellij/psi/impl/source/PsiCodeFragmentImpl.java +++ b/source/com/intellij/psi/impl/source/PsiCodeFragmentImpl.java @@ -11,7 +11,6 @@ import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; import com.intellij.psi.*; -import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.source.tree.ElementType; import com.intellij.psi.scope.ElementClassHint; import com.intellij.psi.scope.NameHint; @@ -30,14 +29,12 @@ public class PsiCodeFragmentImpl extends PsiFileImpl implements PsiCodeFragment, private LinkedHashMap myPseudoImports = new LinkedHashMap(); private VisibilityChecker myVisibilityChecker; - public PsiCodeFragmentImpl(PsiManagerImpl manager, + public PsiCodeFragmentImpl(Project manager, IElementType contentElementType, boolean isPhysical, String name, - char[] text, - int startOffset, - int endOffset) { - super(manager, CODE_FRAGMENT, contentElementType, name, text, startOffset, endOffset); + CharSequence text) { + super(manager, CODE_FRAGMENT, contentElementType, name, text); myPhysical = isPhysical; } @@ -173,7 +170,7 @@ public class PsiCodeFragmentImpl extends PsiFileImpl implements PsiCodeFragment, } - IElementType i = getContentElementType(); + IElementType i = myContentElementType; if (i == ElementType.TYPE_TEXT) { return true; } diff --git a/source/com/intellij/psi/impl/source/PsiExpressionCodeFragmentImpl.java b/source/com/intellij/psi/impl/source/PsiExpressionCodeFragmentImpl.java index 1bff417eb8b1..6aa9183f956e 100644 --- a/source/com/intellij/psi/impl/source/PsiExpressionCodeFragmentImpl.java +++ b/source/com/intellij/psi/impl/source/PsiExpressionCodeFragmentImpl.java @@ -1,20 +1,19 @@ package com.intellij.psi.impl.source; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.project.Project; import com.intellij.psi.PsiExpression; import com.intellij.psi.PsiExpressionCodeFragment; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.source.tree.*; import com.intellij.psi.impl.source.parsing.ChameleonTransforming; -import com.intellij.lang.ASTNode; +import com.intellij.psi.impl.source.tree.ElementType; +import com.intellij.psi.impl.source.tree.TreeUtil; public class PsiExpressionCodeFragmentImpl extends PsiCodeFragmentImpl implements PsiExpressionCodeFragment { - public PsiExpressionCodeFragmentImpl(PsiManagerImpl manager, + public PsiExpressionCodeFragmentImpl(Project project, boolean isPhysical, String name, - char[] text, - int startOffset, - int endOffset) { - super(manager, ElementType.EXPRESSION_TEXT, isPhysical, name, text, startOffset, endOffset); + CharSequence text) { + super(project, ElementType.EXPRESSION_TEXT, isPhysical, name, text); } public PsiExpression getExpression() { diff --git a/source/com/intellij/psi/impl/source/PsiFileImpl.java b/source/com/intellij/psi/impl/source/PsiFileImpl.java index 45a7bfe8251f..17cec5698515 100644 --- a/source/com/intellij/psi/impl/source/PsiFileImpl.java +++ b/source/com/intellij/psi/impl/source/PsiFileImpl.java @@ -7,6 +7,9 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.LanguageFileType; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.ex.dummy.DummyFileSystem; @@ -17,6 +20,7 @@ import com.intellij.psi.impl.file.PsiFileImplUtil; import com.intellij.psi.impl.source.tree.*; import com.intellij.psi.tree.IElementType; import com.intellij.util.ArrayUtil; +import com.intellij.util.CharTable; import com.intellij.util.IncorrectOperationException; import com.intellij.util.LocalTimeCounter; import com.intellij.util.text.CharArrayUtil; @@ -28,7 +32,7 @@ public abstract class PsiFileImpl extends NonSlaveRepositoryPsiElement implement private String myName; // for myFile == null only private final IElementType myElementType; - private final IElementType myContentElementType; + protected final IElementType myContentElementType; private long myModificationStamp; private boolean myModificationStampSticky = false; @@ -37,33 +41,36 @@ public abstract class PsiFileImpl extends NonSlaveRepositoryPsiElement implement private boolean myExplicitlySetAsPhysical; private boolean myExplicitlySetAsValid; - protected PsiFileImpl(PsiManagerImpl manager, IElementType elementType, IElementType contentElementType, VirtualFile file) { - super(manager, -2); + protected PsiFileImpl(Project project, IElementType elementType, IElementType contentElementType, VirtualFile file) { + super((PsiManagerImpl)PsiManager.getInstance(project), -2); myFile = file; myElementType = elementType; myContentElementType = contentElementType; myModificationStamp = file.getModificationStamp(); } - protected PsiFileImpl(PsiManagerImpl manager, + protected PsiFileImpl(Project project, IElementType elementType, IElementType contentElementType, String name, - char[] text, - int startOffset, - int endOffset) { - super(manager, (RepositoryTreeElement)Factory.createCompositeElement(elementType)); + CharSequence text) { + super((PsiManagerImpl)PsiManager.getInstance(project), (RepositoryTreeElement)Factory.createCompositeElement(elementType)); LOG.assertTrue(name != null); myName = name; myFile = null; myElementType = elementType; myContentElementType = contentElementType; final FileElement parent = getTreeElement(); - TreeElement contentElement = Factory.createLeafElement(myContentElementType, text, startOffset, endOffset, -1, parent.getCharTable()); + char[] chars = CharArrayUtil.fromSequence(text); + TreeElement contentElement = createContentLeafElement(chars, 0, text.length(), parent.getCharTable()); TreeUtil.addChildren(parent, contentElement); myModificationStamp = LocalTimeCounter.currentTime(); } + public TreeElement createContentLeafElement(final char[] text, final int startOffset, final int endOffset, final CharTable table) { + return Factory.createLeafElement(myContentElementType, text, startOffset, endOffset, -1, table); + } + protected PsiFileImpl(PsiManagerImpl manager, IElementType elementType) { super(manager, (RepositoryTreeElement)Factory.createCompositeElement(elementType)); myElementType = elementType; @@ -114,13 +121,6 @@ public abstract class PsiFileImpl extends NonSlaveRepositoryPsiElement implement return myFile; } - public void setVirtualFile(VirtualFile file) { - myFile = file; - if (file != null) { - myName = null; - } - } - public boolean isValid() { if (myFile == null || myExplicitlySetAsValid) return true; // "dummy" file if (!myFile.isValid()) return false; @@ -132,34 +132,39 @@ public abstract class PsiFileImpl extends NonSlaveRepositoryPsiElement implement } public FileElement loadTreeElement() { - // load document outside lock for better performance - if (!isPhysical()) { - return getTreeElement(); - } - final Document document = FileDocumentManager.getInstance().getDocument(myFile); - - synchronized (PsiLock.LOCK) { - FileElement treeElement = getTreeElement(); - if (treeElement != null) return treeElement; - if (myFile != null && myManager.isAssertOnFileLoading(myFile)) { - LOG.error("File text loaded " + myFile.getPresentableUrl()); + // load document outside lock for better performance + if (!isPhysical()) { + return getTreeElement(); } - treeElement = (FileElement)Factory.createCompositeElement(myElementType); - treeElement.setDocument(document); - final CharSequence docText = document.getCharsSequence(); - char[] chars = CharArrayUtil.fromSequence(docText); + final Document document = FileDocumentManager.getInstance().getDocument(myFile); - TreeElement contentElement = - Factory.createLeafElement(myContentElementType, chars, 0, docText.length(), -1, treeElement.getCharTable()); - TreeUtil.addChildren(treeElement, contentElement); - setTreeElement(treeElement); - treeElement.setPsiElement(this); + synchronized (PsiLock.LOCK) { + FileElement treeElement = getTreeElement(); + if (treeElement != null) return treeElement; + if (myFile != null && myManager.isAssertOnFileLoading(myFile)) { + LOG.error("File text loaded " + myFile.getPresentableUrl()); + } + final CharSequence docText = document.getCharsSequence(); + + treeElement = createFileElement(docText); + + treeElement.setDocument(document); + setTreeElement(treeElement); + treeElement.setPsiElement(this); ((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(myManager.getProject())).contentsLoaded(this); - if (LOG.isDebugEnabled()) { - LOG.debug("Loaded text for file " + myFile.getPresentableUrl()); + if (LOG.isDebugEnabled()) { + LOG.debug("Loaded text for file " + myFile.getPresentableUrl()); + } + return treeElement; } - return treeElement; } + + protected FileElement createFileElement(final CharSequence docText) { + final FileElement treeElement = (FileElement)Factory.createCompositeElement(myElementType); + char[] chars = CharArrayUtil.fromSequence(docText); + TreeElement contentElement = createContentLeafElement(chars, 0, docText.length(), treeElement.getCharTable()); + TreeUtil.addChildren(treeElement, contentElement); + return treeElement; } public PsiJavaCodeReferenceElement findImportReferenceTo(PsiClass aClass) { @@ -318,10 +323,6 @@ public abstract class PsiFileImpl extends NonSlaveRepositoryPsiElement implement return copy; } - public IElementType getContentElementType() { - return myContentElementType; - } - public T getCopyableUserData(Key key) { return getCopyableUserDataImpl(key); } @@ -337,6 +338,7 @@ public abstract class PsiFileImpl extends NonSlaveRepositoryPsiElement implement public abstract Lexer createLexer(); public Language getLanguage() { - return getFileType().getLanguage(); + final FileType fileType = getFileType(); + return fileType instanceof LanguageFileType ? ((LanguageFileType)fileType).getLanguage() : null; } } diff --git a/source/com/intellij/psi/impl/source/PsiJavaFileBaseImpl.java b/source/com/intellij/psi/impl/source/PsiJavaFileBaseImpl.java index 25f10178bbbc..abe0b272341e 100644 --- a/source/com/intellij/psi/impl/source/PsiJavaFileBaseImpl.java +++ b/source/com/intellij/psi/impl/source/PsiJavaFileBaseImpl.java @@ -1,12 +1,11 @@ package com.intellij.psi.impl.source; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.tree.IElementType; import com.intellij.psi.impl.PsiImplUtil; -import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.source.resolve.ClassResolverProcessor; import com.intellij.psi.impl.source.resolve.ResolveCache; import com.intellij.psi.impl.source.tree.ChildRole; @@ -14,6 +13,7 @@ import com.intellij.psi.scope.ElementClassHint; import com.intellij.psi.scope.NameHint; import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.scope.util.PsiScopesUtil; +import com.intellij.psi.tree.IElementType; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; @@ -34,18 +34,16 @@ public abstract class PsiJavaFileBaseImpl extends PsiFileImpl implements PsiJava private static final String[] IMPLICIT_IMPORTS = new String[]{ "java.lang" }; - protected PsiJavaFileBaseImpl(PsiManagerImpl manager, - IElementType elementType, - IElementType contentElementType, - String name, - char[] text, - int startOffset, - int endOffset) { - super(manager, elementType, contentElementType, name, text, startOffset, endOffset); + protected PsiJavaFileBaseImpl(Project project, + IElementType elementType, + IElementType contentElementType, + String name, + CharSequence text) { + super(project, elementType, contentElementType, name, text); } - protected PsiJavaFileBaseImpl(PsiManagerImpl manager, IElementType elementType, IElementType contentElementType, VirtualFile file) { - super(manager, elementType, contentElementType, file); + protected PsiJavaFileBaseImpl(Project project, IElementType elementType, IElementType contentElementType, VirtualFile file) { + super(project, elementType, contentElementType, file); } public void subtreeChanged() { diff --git a/source/com/intellij/psi/impl/source/PsiJavaFileImpl.java b/source/com/intellij/psi/impl/source/PsiJavaFileImpl.java index a90a6c9b4041..a67bbe6ebd87 100644 --- a/source/com/intellij/psi/impl/source/PsiJavaFileImpl.java +++ b/source/com/intellij/psi/impl/source/PsiJavaFileImpl.java @@ -4,17 +4,17 @@ import com.intellij.lexer.JavaLexer; import com.intellij.lexer.Lexer; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiManagerImpl; public class PsiJavaFileImpl extends PsiJavaFileBaseImpl { - public PsiJavaFileImpl(PsiManagerImpl manager, VirtualFile file) { - super(manager, JAVA_FILE, JAVA_FILE_TEXT, file); + public PsiJavaFileImpl(Project project, VirtualFile file) { + super(project, JAVA_FILE, JAVA_FILE_TEXT, file); } - public PsiJavaFileImpl(PsiManagerImpl manager, String name, char[] text, int startOffset, int endOffset) { - super(manager, JAVA_FILE, JAVA_FILE_TEXT, name, text, startOffset, endOffset); + public PsiJavaFileImpl(Project project, String name, CharSequence text) { + super(project, JAVA_FILE, JAVA_FILE_TEXT, name, text); } public String toString(){ diff --git a/source/com/intellij/psi/impl/source/PsiPlainTextFileImpl.java b/source/com/intellij/psi/impl/source/PsiPlainTextFileImpl.java index 2eb2680d85de..150a7c635af8 100644 --- a/source/com/intellij/psi/impl/source/PsiPlainTextFileImpl.java +++ b/source/com/intellij/psi/impl/source/PsiPlainTextFileImpl.java @@ -4,29 +4,27 @@ import com.intellij.lexer.Lexer; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiPlainTextFile; import com.intellij.psi.PsiReference; -import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.source.resolve.ResolveUtil; import com.intellij.uiDesigner.ReferenceUtil; public class PsiPlainTextFileImpl extends PsiFileImpl implements PsiPlainTextFile{ private final FileType myFileType; - public PsiPlainTextFileImpl(PsiManagerImpl manager, VirtualFile file) { - super(manager, PLAIN_TEXT_FILE, PLAIN_TEXT, file); + public PsiPlainTextFileImpl(Project project, VirtualFile file) { + super(project, PLAIN_TEXT_FILE, PLAIN_TEXT, file); myFileType = FileTypeManager.getInstance().getFileTypeByFile(file); } - public PsiPlainTextFileImpl(PsiManagerImpl manager, + public PsiPlainTextFileImpl(Project project, String name, FileType fileType, - char[] text, - int startOffset, - int endOffset) { - super(manager, PLAIN_TEXT_FILE, PLAIN_TEXT, name, text, startOffset, endOffset); + CharSequence text) { + super(project, PLAIN_TEXT_FILE, PLAIN_TEXT, name, text); myFileType = fileType; } diff --git a/source/com/intellij/psi/impl/source/PsiTypeCodeFragmentImpl.java b/source/com/intellij/psi/impl/source/PsiTypeCodeFragmentImpl.java index e21adfdfd7ef..e9e0fbfe004b 100644 --- a/source/com/intellij/psi/impl/source/PsiTypeCodeFragmentImpl.java +++ b/source/com/intellij/psi/impl/source/PsiTypeCodeFragmentImpl.java @@ -1,7 +1,7 @@ package com.intellij.psi.impl.source; +import com.intellij.openapi.project.Project; import com.intellij.psi.*; -import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.util.PsiUtil; /** @@ -10,13 +10,11 @@ import com.intellij.psi.util.PsiUtil; public class PsiTypeCodeFragmentImpl extends PsiCodeFragmentImpl implements PsiTypeCodeFragment { private final boolean myAllowEllipsis; - public PsiTypeCodeFragmentImpl(PsiManagerImpl manager, + public PsiTypeCodeFragmentImpl(Project manager, boolean isPhysical, boolean allowEllipsis, String name, - char[] text, - int startOffset, - int endOffset) { - super(manager, TYPE_TEXT, isPhysical, name, text, startOffset, endOffset); + CharSequence text) { + super(manager, TYPE_TEXT, isPhysical, name, text); myAllowEllipsis = allowEllipsis; } diff --git a/source/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java b/source/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java index 926aa0bbfe15..2e7cf928e1ec 100644 --- a/source/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java +++ b/source/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java @@ -6,6 +6,7 @@ import com.intellij.lang.ASTNode; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ex.ApplicationEx; import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiFile; @@ -110,7 +111,7 @@ public class CodeFormatterFacade implements Constants { public ASTNode processRange(ASTNode element, int startOffset, int endOffset) { FileType fileType = myHelper.getFileType(); if (useNewFormatter(fileType)) { - PseudoTextBuilder pseudoTextBuilder = fileType.getLanguage().getFormatter(); + PseudoTextBuilder pseudoTextBuilder = ((LanguageFileType)fileType).getLanguage().getFormatter(); if (pseudoTextBuilder == null) { return element; } diff --git a/source/com/intellij/psi/impl/source/html/HtmlFileImpl.java b/source/com/intellij/psi/impl/source/html/HtmlFileImpl.java index eab2409a9842..4fbbf3533eba 100644 --- a/source/com/intellij/psi/impl/source/html/HtmlFileImpl.java +++ b/source/com/intellij/psi/impl/source/html/HtmlFileImpl.java @@ -1,14 +1,14 @@ package com.intellij.psi.impl.source.html; -import com.intellij.psi.impl.source.xml.XmlFileImpl; -import com.intellij.psi.impl.source.tree.CompositeElement; -import com.intellij.psi.impl.source.tree.ChildRole; -import com.intellij.psi.impl.source.parsing.ChameleonTransforming; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.xml.XmlElementType; -import com.intellij.psi.xml.XmlDocument; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.impl.source.parsing.ChameleonTransforming; +import com.intellij.psi.impl.source.tree.ChildRole; +import com.intellij.psi.impl.source.tree.CompositeElement; +import com.intellij.psi.impl.source.xml.XmlFileImpl; +import com.intellij.psi.xml.XmlDocument; +import com.intellij.psi.xml.XmlElementType; /** * Created by IntelliJ IDEA. @@ -18,12 +18,12 @@ import com.intellij.openapi.fileTypes.FileType; * To change this template use File | Settings | File Templates. */ public class HtmlFileImpl extends XmlFileImpl { - public HtmlFileImpl(PsiManagerImpl manager, VirtualFile file) { - super(manager, file, XmlElementType.HTML_FILE, XmlElementType.HTML_FILE_TEXT); + public HtmlFileImpl(Project project, VirtualFile file) { + super(project, file, XmlElementType.HTML_FILE, XmlElementType.HTML_FILE_TEXT); } - public HtmlFileImpl(PsiManagerImpl manager, String name, char[] text, int startOffset, int endOffset, FileType fileType) { - super(manager, name, text, startOffset, endOffset, fileType, XmlElementType.HTML_FILE); + public HtmlFileImpl(Project project, String name, CharSequence text, FileType fileType) { + super(project, name, text, fileType, XmlElementType.HTML_FILE); } public String toString() { diff --git a/source/com/intellij/psi/impl/source/text/BlockSupportImpl.java b/source/com/intellij/psi/impl/source/text/BlockSupportImpl.java index f7835959f557..dd968b44cc89 100644 --- a/source/com/intellij/psi/impl/source/text/BlockSupportImpl.java +++ b/source/com/intellij/psi/impl/source/text/BlockSupportImpl.java @@ -1,5 +1,6 @@ package com.intellij.psi.impl.source.text; +import com.intellij.lang.ASTNode; import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.FileType; @@ -20,7 +21,6 @@ import com.intellij.psi.impl.source.tree.*; import com.intellij.psi.text.BlockSupport; import com.intellij.util.CharTable; import com.intellij.util.IncorrectOperationException; -import com.intellij.lang.ASTNode; public class BlockSupportImpl extends BlockSupport implements Constants, ProjectComponent { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.text.BlockSupportImpl"); @@ -147,8 +147,7 @@ public class BlockSupportImpl extends BlockSupport implements Constants, Project FileType fileType) { if(parent instanceof CodeFragmentElement){ final FileElement holderElement = new DummyHolder(fileImpl.getManager(), null).getTreeElement(); - LeafElement chameleon = Factory.createLeafElement(fileImpl.getContentElementType(), newFileText, 0, textLength, -1, holderElement.getCharTable()); - TreeUtil.addChildren(holderElement, chameleon); + TreeUtil.addChildren(holderElement, fileImpl.createContentLeafElement(newFileText, 0, textLength, holderElement.getCharTable())); parent.replaceAllChildrenToChildrenOf(holderElement); } else{ diff --git a/source/com/intellij/psi/impl/source/tree/FileElement.java b/source/com/intellij/psi/impl/source/tree/FileElement.java index 7eb383f2473d..89de66ac1bfd 100644 --- a/source/com/intellij/psi/impl/source/tree/FileElement.java +++ b/source/com/intellij/psi/impl/source/tree/FileElement.java @@ -1,5 +1,6 @@ package com.intellij.psi.impl.source.tree; +import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.psi.PsiLock; @@ -9,9 +10,8 @@ import com.intellij.psi.impl.source.SourceTreeToPsiMap; import com.intellij.psi.impl.source.SrcRepositoryPsiElement; import com.intellij.psi.tree.IElementType; import com.intellij.util.CharTable; -import com.intellij.lang.ASTNode; -public abstract class FileElement extends RepositoryTreeElement{ +public class FileElement extends RepositoryTreeElement{ private Document myDocument; // only to hold document private CharTable myCharTable = new CharTableImpl(); private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.FileElement"); @@ -20,7 +20,7 @@ public abstract class FileElement extends RepositoryTreeElement{ return myCharTable; } - protected FileElement(IElementType type) { + public FileElement(IElementType type) { super(type); } diff --git a/source/com/intellij/psi/impl/source/xml/XmlFileImpl.java b/source/com/intellij/psi/impl/source/xml/XmlFileImpl.java index 1f44dc1b066b..dd9e90e6d19f 100644 --- a/source/com/intellij/psi/impl/source/xml/XmlFileImpl.java +++ b/source/com/intellij/psi/impl/source/xml/XmlFileImpl.java @@ -4,17 +4,17 @@ import com.intellij.lexer.Lexer; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; -import com.intellij.psi.tree.IElementType; -import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.source.PsiFileImpl; import com.intellij.psi.impl.source.parsing.ChameleonTransforming; import com.intellij.psi.impl.source.parsing.xml.XmlPsiLexer; import com.intellij.psi.impl.source.tree.ChildRole; import com.intellij.psi.impl.source.tree.CompositeElement; import com.intellij.psi.search.PsiElementProcessor; +import com.intellij.psi.tree.IElementType; import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; @@ -22,12 +22,12 @@ import com.intellij.psi.xml.XmlFile; * @author Mike */ public class XmlFileImpl extends PsiFileImpl implements XmlFile { - public XmlFileImpl(PsiManagerImpl manager, VirtualFile file) { - super(manager, XML_FILE, getChameleonTypeByFile(file), file); + public XmlFileImpl(Project project, VirtualFile file) { + super(project, XML_FILE, getChameleonTypeByFile(file), file); } - public XmlFileImpl(PsiManagerImpl manager, VirtualFile file, IElementType elementType, IElementType contentElementType) { - super(manager, elementType, contentElementType, file); + public XmlFileImpl(Project project, VirtualFile file, IElementType elementType, IElementType contentElementType) { + super(project, elementType, contentElementType, file); } private static IElementType getChameleonTypeByFile(VirtualFile file) { @@ -36,27 +36,19 @@ public class XmlFileImpl extends PsiFileImpl implements XmlFile { } private static IElementType getElementType(final FileType fileTypeByFile) { - if(fileTypeByFile == StdFileTypes.XML) { - return XML_FILE_TEXT; - } - if (fileTypeByFile == StdFileTypes.XHTML) { - return XHTML_FILE_TEXT; - } - if(fileTypeByFile == StdFileTypes.HTML) return HTML_FILE_TEXT; - if(fileTypeByFile == StdFileTypes.DTD) return DTD_FILE_TEXT; + if (fileTypeByFile == StdFileTypes.XML) return XML_FILE_TEXT; + if (fileTypeByFile == StdFileTypes.XHTML) return XHTML_FILE_TEXT; + if (fileTypeByFile == StdFileTypes.HTML) return HTML_FILE_TEXT; + if (fileTypeByFile == StdFileTypes.DTD) return DTD_FILE_TEXT; return null; } - public IElementType getContentElementType() { - return getElementType(myType); + public XmlFileImpl(Project project, String name, CharSequence text, FileType fileType) { + super(project, XML_FILE, getElementType(fileType), name, text); } - public XmlFileImpl(PsiManagerImpl manager, String name, char[] text, int startOffset, int endOffset, FileType fileType) { - super(manager, XML_FILE, getElementType(fileType), name, text, startOffset, endOffset); - } - - public XmlFileImpl(PsiManagerImpl manager, String name, char[] text, int startOffset, int endOffset, FileType fileType, IElementType elementType) { - super(manager, elementType, getElementType(fileType), name, text, startOffset, endOffset); + public XmlFileImpl(Project project, String name, CharSequence text, FileType fileType, IElementType elementType) { + super(project, elementType, getElementType(fileType), name, text); } public XmlDocument getDocument() { diff --git a/source/com/intellij/psi/impl/source/xml/XmlTextImpl.java b/source/com/intellij/psi/impl/source/xml/XmlTextImpl.java index 6b70a6509c97..dcc945d062b0 100644 --- a/source/com/intellij/psi/impl/source/xml/XmlTextImpl.java +++ b/source/com/intellij/psi/impl/source/xml/XmlTextImpl.java @@ -1,30 +1,22 @@ package com.intellij.psi.impl.source.xml; -import com.intellij.psi.xml.*; -import com.intellij.psi.impl.source.tree.*; -import com.intellij.psi.impl.source.xml.aspect.XmlTextChanged; -import com.intellij.psi.impl.source.SourceTreeToPsiMap; -import com.intellij.psi.impl.source.DummyHolder; -import com.intellij.psi.tree.IElementType; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiElementVisitor; -import com.intellij.psi.html.HtmlTag; -import com.intellij.util.IncorrectOperationException; -import com.intellij.util.CharTable; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.fileTypes.FileType; -import com.intellij.xml.util.XmlTagTextUtil; -import com.intellij.pom.PomModel; -import com.intellij.pom.PomTransaction; -import com.intellij.pom.impl.PomTransactionBase; -import com.intellij.pom.event.PomModelEvent; import com.intellij.lang.ASTNode; import com.intellij.lang.Language; import com.intellij.lang.xml.XMLLanguage; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.LanguageFileType; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.impl.source.tree.TreeElement; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.xml.*; +import com.intellij.util.IncorrectOperationException; +import com.intellij.xml.util.XmlTagTextUtil; -import java.util.List; import java.util.ArrayList; import java.util.Iterator; +import java.util.List; public class XmlTextImpl extends XmlElementImpl implements XmlText { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.xml.XmlTextImpl"); @@ -245,6 +237,6 @@ public class XmlTextImpl extends XmlElementImpl implements XmlText { public Language getLanguage() { final FileType fileType = getContainingFile().getFileType(); - return fileType.getLanguage(); + return ((LanguageFileType)fileType).getLanguage(); } }