mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Reparse for language dialects
This commit is contained in:
@@ -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);
|
||||
|
||||
+3
-3
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -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){
|
||||
|
||||
Reference in New Issue
Block a user