diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaDummyHolder.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaDummyHolder.java index d03ec0fc0972..9580c45d0276 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaDummyHolder.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaDummyHolder.java @@ -35,7 +35,7 @@ public class JavaDummyHolder extends DummyHolder implements PsiImportHolder { private Map myPseudoImports = EMPTY; public JavaDummyHolder(@NotNull PsiManager manager, TreeElement contentElement, PsiElement context) { - super(manager, contentElement, context, null, null, JavaLanguage.INSTANCE); + super(manager, contentElement, context, null, null, language(context, JavaLanguage.INSTANCE)); } public JavaDummyHolder(@NotNull PsiManager manager, CharTable table, boolean validity) { @@ -43,15 +43,15 @@ public class JavaDummyHolder extends DummyHolder implements PsiImportHolder { } public JavaDummyHolder(@NotNull PsiManager manager, PsiElement context) { - super(manager, null, context, null, null, JavaLanguage.INSTANCE); + super(manager, null, context, null, null, language(context, JavaLanguage.INSTANCE)); } public JavaDummyHolder(@NotNull PsiManager manager, TreeElement contentElement, PsiElement context, CharTable table) { - super(manager, contentElement, context, table, null, JavaLanguage.INSTANCE); + super(manager, contentElement, context, table, null, language(context, JavaLanguage.INSTANCE)); } public JavaDummyHolder(@NotNull PsiManager manager, PsiElement context, CharTable table) { - super(manager, null, context, table, null, JavaLanguage.INSTANCE); + super(manager, null, context, table, null, language(context, JavaLanguage.INSTANCE)); } public JavaDummyHolder(@NotNull PsiManager manager, final CharTable table) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementType.java index acd68f964221..4c4776cb1653 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaDocElementType.java @@ -16,6 +16,7 @@ package com.intellij.psi.impl.source.tree; import com.intellij.lang.ASTNode; +import com.intellij.lang.Language; import com.intellij.lang.PsiBuilder; import com.intellij.lang.java.JavaLanguage; import com.intellij.lang.java.parser.JavaParserUtil; @@ -120,7 +121,7 @@ public interface JavaDocElementType { } @Override - public boolean isParsable(final CharSequence buffer, final Project project) { + public boolean isParsable(final CharSequence buffer, Language fileLanguage, final Project project) { final JavaLexer lexer = new JavaLexer(LanguageLevelProjectExtension.getInstance(project).getLanguageLevel()); lexer.start(buffer); if (lexer.getTokenType() == DOC_COMMENT) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java index de737552382a..1dd8689c4fd0 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/JavaElementType.java @@ -165,7 +165,7 @@ public interface JavaElementType { } @Override - public int getErrorsCount(final CharSequence seq, final Project project) { + public int getErrorsCount(final CharSequence seq, Language fileLanguage, final Project project) { final Lexer lexer = new JavaLexer(LanguageLevel.HIGHEST); lexer.start(seq); diff --git a/platform/core-api/src/com/intellij/psi/tree/IReparseableElementType.java b/platform/core-api/src/com/intellij/psi/tree/IReparseableElementType.java index f8cda346ad84..5a1636d9b4b5 100644 --- a/platform/core-api/src/com/intellij/psi/tree/IReparseableElementType.java +++ b/platform/core-api/src/com/intellij/psi/tree/IReparseableElementType.java @@ -42,11 +42,11 @@ public class IReparseableElementType extends ILazyParseableElementType { * chameleon node. * * @param buffer the content to parse. - * @param project the project containing the content. - * @return true if the content is valid, false if not + * @param fileLanguage language of the file + * @param project the project containing the content. @return true if the content is valid, false if not */ - public boolean isParsable(CharSequence buffer, final Project project) { + public boolean isParsable(CharSequence buffer, Language fileLanguage, final Project project) { return false; } } diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/DummyHolder.java b/platform/core-impl/src/com/intellij/psi/impl/source/DummyHolder.java index 4bd9b53cb2c1..1a1a5111c878 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/DummyHolder.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/DummyHolder.java @@ -47,7 +47,15 @@ public class DummyHolder extends PsiFileImpl { } public DummyHolder(@NotNull PsiManager manager, TreeElement contentElement, PsiElement context, CharTable table) { - this(manager, contentElement, context, table, null, context == null ? PlainTextLanguage.INSTANCE : context.getLanguage()); + this(manager, contentElement, context, table, null, language(context, PlainTextLanguage.INSTANCE)); + } + + protected static Language language(PsiElement context, Language defaultLanguage) { + if (context == null) return defaultLanguage; + Language contextLanguage = context.getLanguage(); + Language language = context.getContainingFile().getLanguage(); + if (language.isKindOf(contextLanguage)) return language; + return contextLanguage; } public DummyHolder(@NotNull PsiManager manager, TreeElement contentElement, PsiElement context, CharTable table, Boolean validity, Language language) { diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/text/BlockSupportImpl.java b/platform/core-impl/src/com/intellij/psi/impl/source/text/BlockSupportImpl.java index efb9d3bf0aa8..14ce9c6860c1 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/text/BlockSupportImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/text/BlockSupportImpl.java @@ -112,14 +112,14 @@ public class BlockSupportImpl extends BlockSupport { final TextRange textRange = node.getTextRange(); final IReparseableElementType reparseable = (IReparseableElementType)elementType; - if (reparseable.getLanguage() == baseLanguage) { + if (baseLanguage.isKindOf(reparseable.getLanguage())) { final int start = textRange.getStartOffset(); final int end = start + textRange.getLength() + lengthShift; assertFileLength(file, newFileText, node, elementType, start, end); CharSequence newTextStr = newFileText.subSequence(start, end); - if (reparseable.isParsable(newTextStr, project)) { + if (reparseable.isParsable(newTextStr, baseLanguage, project)) { ASTNode chameleon = reparseable.createNode(newTextStr); if (chameleon != null) { DummyHolder holder = DummyHolderFactory.createHolder(fileImpl.getManager(), null, node.getPsi(), charTable); diff --git a/platform/core-impl/src/com/intellij/psi/tree/IErrorCounterReparseableElementType.java b/platform/core-impl/src/com/intellij/psi/tree/IErrorCounterReparseableElementType.java index 40524866aaea..dfa9c3647f61 100644 --- a/platform/core-impl/src/com/intellij/psi/tree/IErrorCounterReparseableElementType.java +++ b/platform/core-impl/src/com/intellij/psi/tree/IErrorCounterReparseableElementType.java @@ -28,10 +28,10 @@ public abstract class IErrorCounterReparseableElementType extends IReparseableEl super(debugName, language); } - public abstract int getErrorsCount(CharSequence seq, Project project); + public abstract int getErrorsCount(CharSequence seq, Language fileLanguage, Project project); @Override - public boolean isParsable(CharSequence buffer, final Project project) { - return getErrorsCount(buffer, project) == NO_ERRORS; + public boolean isParsable(CharSequence buffer, Language fileLanguage, final Project project) { + return getErrorsCount(buffer, fileLanguage, project) == NO_ERRORS; } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GrCodeBlockElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GrCodeBlockElementType.java index 9ffb906c353e..027a1da94d79 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GrCodeBlockElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GrCodeBlockElementType.java @@ -16,6 +16,7 @@ package org.jetbrains.plugins.groovy.lang.parser; import com.intellij.lang.ASTNode; +import com.intellij.lang.Language; import com.intellij.lexer.Lexer; import com.intellij.openapi.project.Project; import com.intellij.psi.tree.ICompositeElementType; @@ -47,7 +48,7 @@ public abstract class GrCodeBlockElementType extends IErrorCounterReparseableEle public abstract GrBlockImpl createNode(final CharSequence text); @Override - public int getErrorsCount(final CharSequence seq, final Project project) { + public int getErrorsCount(final CharSequence seq, Language fileLanguage, final Project project) { final Lexer lexer = new GroovyLexer(); lexer.start(seq); diff --git a/xml/impl/src/com/intellij/psi/xml/XmlElementType.java b/xml/impl/src/com/intellij/psi/xml/XmlElementType.java index 9e0c058e70cd..24e2316c169e 100644 --- a/xml/impl/src/com/intellij/psi/xml/XmlElementType.java +++ b/xml/impl/src/com/intellij/psi/xml/XmlElementType.java @@ -16,6 +16,7 @@ package com.intellij.psi.xml; import com.intellij.lang.ASTNode; +import com.intellij.lang.Language; import com.intellij.lang.dtd.DTDLanguage; import com.intellij.lang.html.HTMLLanguage; import com.intellij.lang.xhtml.XHTMLLanguage; @@ -75,7 +76,7 @@ public interface XmlElementType extends XmlTokenType { final XmlParsingContext parsingContext = new XmlParsingContext(table); return parsingContext.getXmlParsing().parse(new OldXmlLexer(), chars, 0, chars.length(), SharedImplUtil.getManagerByTree(chameleon)); } - public boolean isParsable(CharSequence buffer, final Project project) {return true;} + public boolean isParsable(CharSequence buffer, Language fileLanguage, final Project project) {return true;} }; IElementType XML_MARKUP = new CustomParsingType("XML_MARKUP_DECL", XMLLanguage.INSTANCE){