diff --git a/src/main/java/com/redhat/devtools/lsp4ij/dap/DAPDebuggerEditorsProvider.java b/src/main/java/com/redhat/devtools/lsp4ij/dap/DAPDebuggerEditorsProvider.java index 83393b89a..3b2ce3a0b 100644 --- a/src/main/java/com/redhat/devtools/lsp4ij/dap/DAPDebuggerEditorsProvider.java +++ b/src/main/java/com/redhat/devtools/lsp4ij/dap/DAPDebuggerEditorsProvider.java @@ -14,6 +14,7 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.impl.DocumentImpl; import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.fileTypes.PlainTextFileType; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; @@ -66,6 +67,13 @@ protected PsiFile createExpressionCodeFragment(@NotNull Project project, // Get file type / language of the file which is debugging when debugger is suspended. fileType = file.getFileType(); language = file.getLanguage(); + // If the file's language is a more specific dialect of the file type's language, degrade to the file type's + if (fileType instanceof LanguageFileType languageFileType) { + Language fileTypeLanguage = languageFileType.getLanguage(); + if (!language.is(fileTypeLanguage) && language.isKindOf(fileTypeLanguage)) { + language = fileTypeLanguage; + } + } } return createExpressionCodeFragment(project, text, fileType, language); } diff --git a/src/test/java/com/redhat/devtools/lsp4ij/dap/DAPDebuggerEditorsProviderTest.java b/src/test/java/com/redhat/devtools/lsp4ij/dap/DAPDebuggerEditorsProviderTest.java new file mode 100644 index 000000000..465c5fa68 --- /dev/null +++ b/src/test/java/com/redhat/devtools/lsp4ij/dap/DAPDebuggerEditorsProviderTest.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2026 Red Hat, Inc. + * Distributed under license by Red Hat, Inc. All rights reserved. + * This program is made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v20.html + * + * Contributors: + * Red Hat, Inc. - initial API and implementation + ******************************************************************************/ + +package com.redhat.devtools.lsp4ij.dap; + +import com.intellij.json.JsonFileType; +import com.intellij.json.JsonLanguage; +import com.intellij.json.json5.Json5Language; +import com.intellij.openapi.fileTypes.MockLanguageFileType; +import com.intellij.openapi.fileTypes.PlainTextFileType; +import com.intellij.openapi.fileTypes.PlainTextLanguage; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiFileFactory; +import com.intellij.testFramework.LightPlatformTestCase; +import com.intellij.testFramework.LightVirtualFile; + +public class DAPDebuggerEditorsProviderTest extends LightPlatformTestCase { + + public void testWithSimpleLanguage() { + PsiFile textFile = createFile("test.txt", "Hello, world."); + assertEquals(PlainTextFileType.INSTANCE, textFile.getFileType()); + assertEquals(PlainTextLanguage.INSTANCE, textFile.getLanguage()); + + DAPDebuggerEditorsProvider debuggerEditorsProvider = new DAPDebuggerEditorsProvider(PlainTextFileType.INSTANCE, null); + + PsiFile codeFragment = debuggerEditorsProvider.createExpressionCodeFragment(getProject(), "", textFile, true); + assertEquals(PlainTextFileType.INSTANCE, codeFragment.getFileType()); + assertEquals(PlainTextLanguage.INSTANCE, codeFragment.getLanguage()); + } + + public void testWithDialectLanguage() { + // Create a file with the dialect language + PsiFile dialectFile = PsiFileFactory.getInstance(getProject()).createFileFromText("test.json", Json5Language.INSTANCE, "{}"); + VirtualFile dialectVirtualFile = dialectFile.getVirtualFile(); + // Force the file type to be the base instead of the one inferred from the dialect language used above + ((LightVirtualFile) dialectVirtualFile).setFileType(JsonFileType.INSTANCE); + assertEquals(JsonFileType.INSTANCE, dialectFile.getFileType()); + assertEquals(Json5Language.INSTANCE, dialectFile.getLanguage()); + + // This should also use the base file type + DAPDebuggerEditorsProvider debuggerEditorsProvider = new DAPDebuggerEditorsProvider(MockLanguageFileType.INSTANCE, null); + + // If the original issue exists, this will fail with "JSON5 doesn't participate in view provider..." + PsiFile codeFragment = debuggerEditorsProvider.createExpressionCodeFragment(getProject(), "", dialectFile, true); + assertEquals(JsonFileType.INSTANCE, codeFragment.getFileType()); + // It should have degraded to the base language + assertEquals(JsonLanguage.INSTANCE, codeFragment.getLanguage()); + } +}