[PSI] avoid loading KtFile class during parsing of chameleons

^KTIJ-28801 fixed
This commit is contained in:
Anna Kozlova
2024-02-14 15:30:16 +01:00
committed by Space Team
parent d925d3be76
commit b4b1c7cd69
@@ -25,7 +25,6 @@ import com.intellij.psi.PsiFile;
import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.idea.KotlinFileType; import org.jetbrains.kotlin.idea.KotlinFileType;
import org.jetbrains.kotlin.psi.KtFile;
public class KotlinParser implements PsiParser { public class KotlinParser implements PsiParser {
@@ -44,7 +43,7 @@ public class KotlinParser implements PsiParser {
public static ASTNode parse(PsiBuilder psiBuilder, PsiFile psiFile) { public static ASTNode parse(PsiBuilder psiBuilder, PsiFile psiFile) {
KotlinParsing ktParsing = KotlinParsing.createForTopLevel(new SemanticWhitespaceAwarePsiBuilderImpl(psiBuilder)); KotlinParsing ktParsing = KotlinParsing.createForTopLevel(new SemanticWhitespaceAwarePsiBuilderImpl(psiBuilder));
String extension = FileUtilRt.getExtension(psiFile.getName()); String extension = FileUtilRt.getExtension(psiFile.getName());
if (extension.isEmpty() || extension.equals(KotlinFileType.EXTENSION) || (psiFile instanceof KtFile && ((KtFile) psiFile).isCompiled())) { if (extension.isEmpty() || extension.equals(KotlinFileType.EXTENSION) || isCompiledFile(psiFile)) {
ktParsing.parseFile(); ktParsing.parseFile();
} }
else { else {
@@ -53,6 +52,13 @@ public class KotlinParser implements PsiParser {
return psiBuilder.getTreeBuilt(); return psiBuilder.getTreeBuilt();
} }
@SuppressWarnings({"deprecation", "UnnecessaryFullyQualifiedName"})
private static boolean isCompiledFile(PsiFile psiFile) {
//avoid loading KtFile which depends on java psi, which is not available in some setup
//e.g. remote dev https://youtrack.jetbrains.com/issue/GTW-7554
return psiFile instanceof org.jetbrains.kotlin.psi.KtCommonFile && ((org.jetbrains.kotlin.psi.KtCommonFile) psiFile).isCompiled();
}
@NotNull @NotNull
public static ASTNode parseTypeCodeFragment(PsiBuilder psiBuilder) { public static ASTNode parseTypeCodeFragment(PsiBuilder psiBuilder) {
KotlinParsing ktParsing = KotlinParsing.createForTopLevel(new SemanticWhitespaceAwarePsiBuilderImpl(psiBuilder)); KotlinParsing ktParsing = KotlinParsing.createForTopLevel(new SemanticWhitespaceAwarePsiBuilderImpl(psiBuilder));