Yaml: support injection by filetype name in comment (IDEA-267035)

GitOrigin-RevId: 894f17484c4bb354ad6f89c36147bf5fe764e4d0
This commit is contained in:
Nicolay Mitropolsky
2021-05-12 17:38:43 +03:00
committed by intellij-monorepo-bot
parent 9a1d9b8a99
commit a63bf5c21c
7 changed files with 41 additions and 15 deletions

View File

@@ -34,6 +34,11 @@ public abstract class JsonSchemaInjectorBase implements MultiHostInjector {
return language.getID();
}
@Override
public @NotNull Language getInjectedLanguage() {
return language;
}
@Override
public @NotNull String getPrefix() {
return StringUtil.notNullize(prefix) ;

View File

@@ -1,6 +1,7 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.lang.injection.general;
import com.intellij.lang.Language;
import com.intellij.openapi.util.NlsSafe;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
@@ -15,6 +16,9 @@ public interface Injection {
@NotNull
@NlsSafe
String getInjectedLanguageId();
@Nullable
Language getInjectedLanguage();
/**
* @return a string (in the injected language), which is prepended to the code in the host literal to form a parseable code fragment.

View File

@@ -1,19 +1,20 @@
// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.lang.injection.general;
import com.intellij.lang.Language;
import com.intellij.openapi.util.NlsSafe;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class SimpleInjection implements Injection {
private final String injectedId;
private final Language language;
private final String prefix;
private final String suffix;
private final String supportId;
public SimpleInjection(@NotNull String injectedId, @NotNull String prefix, @NotNull String suffix, @Nullable String supportId) {
this.injectedId = injectedId;
public SimpleInjection(@NotNull Language language, @NotNull String prefix, @NotNull String suffix, @Nullable String supportId) {
this.language = language;
this.prefix = prefix;
this.suffix = suffix;
this.supportId = supportId;
@@ -21,7 +22,12 @@ public class SimpleInjection implements Injection {
@Override
public @NotNull @NlsSafe String getInjectedLanguageId() {
return injectedId;
return language.getID();
}
@Override
public Language getInjectedLanguage() {
return language;
}
@Override

View File

@@ -28,7 +28,7 @@ public final class TemporaryPlacesInjector implements LanguageInjectionContribut
Language language = injectedLanguage != null ? injectedLanguage.getLanguage() : null;
if (language == null) return null;
return new SimpleInjection(language.getID(),
return new SimpleInjection(language,
injectedLanguage.getPrefix(),
injectedLanguage.getSuffix(),
registry.getLanguageInjectionSupport().getId());

View File

@@ -83,9 +83,9 @@ public class BaseInjection implements Injection, PersistentStateComponent<Elemen
myPlaces = places;
}
@Nullable
public Language getInjectedLanguage() {
return InjectedLanguage.findLanguageById(myInjectedLanguageId);
@Override
public @Nullable Language getInjectedLanguage() {
return InjectorUtils.getLanguage(this);
}
private InjectionPlace @NotNull [] myPlaces = InjectionPlace.EMPTY_ARRAY;

View File

@@ -2,17 +2,13 @@
package org.jetbrains.yaml
import com.intellij.injected.editor.InjectionMeta
import com.intellij.lang.Language
import com.intellij.lang.injection.general.LanguageInjectionPerformer
import com.intellij.lang.injection.MultiHostRegistrar
import com.intellij.lang.injection.general.Injection
import com.intellij.openapi.util.text.StringUtil
import org.jetbrains.yaml.psi.YAMLScalar
import com.intellij.lang.injection.general.LanguageInjectionPerformer
import com.intellij.psi.ElementManipulators
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiLanguageInjectionHost
import com.intellij.util.text.escLBr
import com.intellij.util.text.nullize
import org.jetbrains.yaml.psi.YAMLScalar
import org.jetbrains.yaml.psi.impl.YAMLBlockScalarImpl
import org.jetbrains.yaml.psi.impl.YAMLScalarImpl
@@ -25,7 +21,7 @@ class YamlLanguageInjectionPerformer : LanguageInjectionPerformer {
injection: Injection,
context: PsiElement): Boolean {
if (context !is YAMLScalar) return false
val language = Language.findLanguageByID(injection.injectedLanguageId) ?: return false
val language = injection.injectedLanguage ?: return false
registrar.startInjecting(language)
if (context is YAMLScalarImpl) {

View File

@@ -8,6 +8,7 @@ import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.util.parents
import com.intellij.testFramework.fixtures.BasePlatformTestCase
import com.intellij.testFramework.fixtures.InjectionTestFixture
import com.intellij.testFramework.fixtures.injectionForHost
import com.intellij.util.castSafelyTo
import com.intellij.util.containers.Predicate
import com.jetbrains.jsonSchema.JsonSchemaHighlightingTestBase.registerJsonSchema
@@ -47,6 +48,20 @@ class YamlMultilineInjectionTest : BasePlatformTestCase() {
myInjectionFixture.assertInjectedLangAtCaret("XML")
assertInjectedAndLiteralValue("<html>\n<body>boo</body>\n</html>")
}
fun testBashCommentInjection() {
myFixture.configureByText("test.yaml", """
# language=bash
commands:
- sudo rm -rf /
- df -h
""".trimIndent())
myInjectionFixture.assertInjected(
injectionForHost("sudo rm -rf /").hasLanguage("Shell Script"),
injectionForHost("df -h").hasLanguage("Shell Script"),
)
}
fun testFoldedXmlInjection() {