mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-02-04 23:39:07 +07:00
Yaml: support injection by filetype name in comment (IDEA-267035)
GitOrigin-RevId: 894f17484c4bb354ad6f89c36147bf5fe764e4d0
This commit is contained in:
committed by
intellij-monorepo-bot
parent
9a1d9b8a99
commit
a63bf5c21c
@@ -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) ;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user