Reparse for language dialects

This commit is contained in:
Maxim.Mossienko
2012-03-19 13:41:35 +04:00
parent a414164a5f
commit bbbc8644e2
9 changed files with 28 additions and 17 deletions
@@ -35,7 +35,7 @@ public class JavaDummyHolder extends DummyHolder implements PsiImportHolder {
private Map<String, PsiClass> 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) {
@@ -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) {
@@ -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);
@@ -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;
}
}
@@ -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) {
@@ -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);
@@ -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;
}
}
@@ -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);
@@ -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){