com.intellij.lang.injection.MultiHostRegistrar Java Examples

The following examples show how to use com.intellij.lang.injection.MultiHostRegistrar. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: XmlSqlTplMultiHostInjector.java    From NutzCodeInsight with Apache License 2.0 6 votes vote down vote up
@Override
    public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement psiElement) {
        String productCode = INSTANCE.getBuild().getProductCode();
        if (NutzCons.IDEA_VERSION.equals(productCode)) {
            final Language SQL_LANGUAGE = Language.findLanguageByID("SQL");
            if (DomUtil.isNutzSqlFile(psiElement.getContainingFile())) {
                if (psiElement instanceof XmlTag) {
                    XmlTag tag = (XmlTag) psiElement;
                    if (SQL_TAG.equals(tag.getName())) {
                        registrarInjecting(SQL_LANGUAGE, registrar, DomUtil.findXmlTexts(psiElement.getChildren()), null, null);
                    }
//                else if (EXP_TAG.equals(tag.getName())) {
//                    registrarInjecting(XMLLanguage.INSTANCE, registrar, DomUtil.findXmlTexts(psiElement.getChildren()), "<!--", "-->");
//                }
                }
            }
        }
    }
 
Example #2
Source File: FluidInjector.java    From idea-php-typo3-plugin with MIT License 6 votes vote down vote up
@Override
public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) {
    if (context.getLanguage() == XMLLanguage.INSTANCE) return;
    final Project project = context.getProject();
    if (!FluidIndexUtil.hasFluid(project)) return;

    final PsiElement parent = context.getParent();
    if (context instanceof XmlAttributeValueImpl && parent instanceof XmlAttribute) {
        final int length = context.getTextLength();
        final String name = ((XmlAttribute) parent).getName();

        if (isInjectableAttribute(project, length, name)) {
            registrar
                .startInjecting(FluidLanguage.INSTANCE)
                .addPlace(null, null, (PsiLanguageInjectionHost) context, ElementManipulators.getValueTextRange(context))
                .doneInjecting();
        }
    }
}
 
Example #3
Source File: NutzJavaSqlMultiHostInjector.java    From NutzCodeInsight with Apache License 2.0 6 votes vote down vote up
@Override
public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement psiElement) {
    String productCode = INSTANCE.getBuild().getProductCode();
    if (NutzCons.IDEA_VERSION.equals(productCode)) {
        //旗舰版才支持该功能
        final Language SQL_LANGUAGE = Language.findLanguageByID("SQL");
        if (psiElement.getParent() != null && psiElement.getParent().getParent() != null) {
            PsiElement parent = psiElement.getParent().getParent().getParent();
            if (parent != null && parent instanceof PsiAnnotation) {
                String qualifiedName = ((PsiAnnotation) parent).getQualifiedName();
                if (NutzCons.SQLS.contains(qualifiedName)) {
                    registrar.startInjecting(SQL_LANGUAGE);
                    registrar.addPlace(null, null, (PsiLanguageInjectionHost) psiElement, ElementManipulators.getValueTextRange(psiElement));
                    registrar.doneInjecting();
                }
            }
        }
    }
}
 
Example #4
Source File: InjectionRegistrarImpl.java    From consulo with Apache License 2.0 6 votes vote down vote up
@Nonnull
@Override
public MultiHostRegistrar startInjecting(@Nonnull LanguageVersion languageVersion, @Nullable String extension) {
  fileExtension = extension;
  placeInfos = new SmartList<>();

  if (!cleared) {
    clear();
    throw new IllegalStateException("Seems you haven't called doneInjecting()");
  }
  currentThread = Thread.currentThread();

  if (LanguageParserDefinitions.INSTANCE.forLanguage(languageVersion.getLanguage()) == null) {
    throw new UnsupportedOperationException("Cannot inject language '" + languageVersion.getLanguage() + "' because it has no ParserDefinition");
  }
  myLanguageVersion = languageVersion;
  return this;
}
 
Example #5
Source File: InjectedLanguageUtil.java    From consulo with Apache License 2.0 5 votes vote down vote up
/**
 * Start injecting the reference in {@code language} in this place.
 * Unlike {@link MultiHostRegistrar#startInjecting(Language)} this method doesn't inject the full blown file in the other language.
 * Instead, it just marks some range as a reference in some language.
 * For example, you can inject file reference into string literal.
 * After that, it won't be highlighted as an injected fragment but still can be subject to e.g. "Goto declaraion" action.
 */
public static void injectReference(@Nonnull MultiHostRegistrar registrar,
                                   @Nonnull Language language,
                                   @Nonnull String prefix,
                                   @Nonnull String suffix,
                                   @Nonnull PsiLanguageInjectionHost host,
                                   @Nonnull TextRange rangeInsideHost) {
  ((InjectionRegistrarImpl)registrar).injectReference(LanguageVersionUtil.findDefaultVersion(language), prefix, suffix, host, rangeInsideHost);
}
 
Example #6
Source File: MultiHostRegistrarImpl.java    From consulo with Apache License 2.0 5 votes vote down vote up
/**
 * @deprecated Use {@link MultiHostRegistrar#startInjecting(Language)} instead. to be removed in IDEA 2018.1
 */
//@ApiStatus.ScheduledForRemoval(inVersion = "2018.1")
@Deprecated
@Nonnull
@Override
public MultiHostRegistrar startInjecting(@Nonnull Language language) {
  throw new IllegalStateException();
}
 
Example #7
Source File: InjectedLanguageManagerImpl.java    From consulo with Apache License 2.0 5 votes vote down vote up
@Override
public void injectLanguages(@Nonnull final MultiHostRegistrar injectionPlacesRegistrar, @Nonnull PsiElement context) {
  final PsiLanguageInjectionHost host = (PsiLanguageInjectionHost)context;
  InjectedLanguagePlaces placesRegistrar =
          (language, rangeInsideHost, prefix, suffix) -> injectionPlacesRegistrar.startInjecting(language).addPlace(prefix, suffix, host, rangeInsideHost).doneInjecting();
  for (LanguageInjector injector : LanguageInjector.EXTENSION_POINT_NAME.getExtensionList()) {
    injector.getLanguagesToInject(host, placesRegistrar);
  }
}
 
Example #8
Source File: InjectionRegistrarImpl.java    From consulo with Apache License 2.0 5 votes vote down vote up
@Override
@Nonnull
public MultiHostRegistrar addPlace(@NonNls @Nullable String prefix, @NonNls @Nullable String suffix, @Nonnull PsiLanguageInjectionHost host, @Nonnull TextRange rangeInsideHost) {
  checkThreading();
  if (myLanguageVersion == null) {
    clear();
    throw new IllegalStateException("Seems you haven't called startInjecting()");
  }
  if (!host.isValidHost()) {
    throw new IllegalArgumentException(host + ".isValidHost() in " + host.getClass() + " returned false so you mustn't inject here.");
  }
  PsiFile containingFile = PsiUtilCore.getTemplateLanguageFile(host);
  assert containingFile == myHostPsiFile : exceptionContext("Trying to inject into foreign file: " + containingFile, myLanguageVersion, myHostPsiFile, myHostVirtualFile, myHostDocument, placeInfos,
                                                            myDocumentManagerBase);
  TextRange hostTextRange = host.getTextRange();
  if (!hostTextRange.contains(rangeInsideHost.shiftRight(hostTextRange.getStartOffset()))) {
    clear();
    throw new IllegalArgumentException("rangeInsideHost must lie within host text range. rangeInsideHost:" + rangeInsideHost + "; host textRange:" + hostTextRange);
  }

  cleared = false;
  String nnPrefix = StringUtil.isEmpty(prefix) ? "" : prefix; // intern empty strings too to reduce gc
  String nnSuffix = StringUtil.isEmpty(suffix) ? "" : suffix; // intern empty strings too to reduce gc
  PlaceInfo info = new PlaceInfo(nnPrefix, nnSuffix, host, rangeInsideHost);
  placeInfos.add(info);

  return this;
}
 
Example #9
Source File: ParameterLanguageInjector.java    From idea-php-symfony2-plugin with MIT License 5 votes vote down vote up
private void injectLanguage(@NotNull MultiHostRegistrar registrar, @NotNull StringLiteralExpressionImpl element, MethodLanguageInjection languageInjection) {
    Language language = languageInjection.getLanguage();
    if (language == null) {
        return;
    }

    registrar.startInjecting(language)
        .addPlace(languageInjection.getPrefix(), languageInjection.getSuffix(), element, element.getValueRange())
        .doneInjecting();
}
 
Example #10
Source File: CGLanguageInjection.java    From consulo-unity3d with Apache License 2.0 5 votes vote down vote up
@Override
@RequiredReadAction
public void injectLanguages(@Nonnull MultiHostRegistrar registrar, @Nonnull PsiElement context)
{
	ShaderCGScript cgScript = (ShaderCGScript) context;

	PsiElement scriptBlock = cgScript.getScriptBlock();
	if(scriptBlock == null)
	{
		return;
	}

	int startOffsetInParent = scriptBlock.getStartOffsetInParent();
	registrar.startInjecting(CGLanguage.INSTANCE).addPlace(null, null, cgScript, new TextRange(startOffsetInParent, scriptBlock.getTextLength() + startOffsetInParent)).doneInjecting();
}
 
Example #11
Source File: XmlSqlTplMultiHostInjector.java    From NutzCodeInsight with Apache License 2.0 5 votes vote down vote up
private void registrarInjecting(Language language, MultiHostRegistrar registrar, List<PsiElement> els, String prefix, String suffix) {
    if (els.size() > 0) {
        registrar.startInjecting(language);
        els.forEach(el -> registrar.addPlace(prefix, suffix, (PsiLanguageInjectionHost) el, ElementManipulators.getValueTextRange(el)));
        registrar.doneInjecting();
    }
}
 
Example #12
Source File: ParameterLanguageInjector.java    From idea-php-symfony2-plugin with MIT License 4 votes vote down vote up
@Override
public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement element) {
    if (!(element instanceof StringLiteralExpression) || !((PsiLanguageInjectionHost) element).isValidHost()) {
        return;
    }
    if (!Symfony2ProjectComponent.isEnabled(element.getProject())) {
        return;
    }

    final StringLiteralExpressionImpl expr = (StringLiteralExpressionImpl) element;

    PsiElement parent = expr.getParent();

    final boolean isParameter = parent instanceof ParameterList && expr.getPrevPsiSibling() == null; // 1st parameter
    final boolean isAssignment = parent instanceof AssignmentExpression;

    if (!isParameter && !isAssignment) {
        return;
    }

    if (isParameter)  {
        parent = parent.getParent();
    }

    for (MethodLanguageInjection languageInjection : LANGUAGE_INJECTIONS) {
        // $crawler->filter('...')
        // $em->createQuery('...')
        // JsonResponse::fromJsonString('...')
        if (parent instanceof MethodReference) {
            if (PhpElementsUtil.isMethodReferenceInstanceOf((MethodReference) parent, languageInjection.getSignatures())) {
                injectLanguage(registrar, expr, languageInjection);
                return;
            }
        }
        // $dql = "...";
        else if (parent instanceof AssignmentExpression) {
            Language language = languageInjection.getLanguage();
            if (language != null && LANGUAGE_ID_DQL.equals(language.getID())) {
                PhpPsiElement variable = ((AssignmentExpression) parent).getVariable();
                if (variable instanceof Variable) {
                    if (DQL_VARIABLE_NAME.equals(variable.getName())) {
                        injectLanguage(registrar, expr, languageInjection);
                        return;
                    }
                }
            }
        }
    }

}
 
Example #13
Source File: ConcatenationInjectorManager.java    From consulo with Apache License 2.0 4 votes vote down vote up
@Override
public void injectLanguages(@Nonnull MultiHostRegistrar registrar, @Nonnull PsiElement context) {
  ConcatenationInjectorManager manager = getInstance(myProject);
  if (manager.myConcatenationInjectors.isEmpty()) {
    return;
  }

  final PsiFile containingFile = ((InjectionRegistrarImpl)registrar).getHostPsiFile();
  Project project = containingFile.getProject();
  long modificationCount = PsiManager.getInstance(project).getModificationTracker().getModificationCount();
  Pair<PsiElement, PsiElement[]> pair = computeAnchorAndOperands(context);
  PsiElement anchor = pair.first;
  PsiElement[] operands = pair.second;
  Integer noInjectionTimestamp = anchor.getUserData(NO_CONCAT_INJECTION_TIMESTAMP);

  InjectionResult result;
  ParameterizedCachedValue<InjectionResult, PsiElement> data = null;
  if (operands.length == 0 || noInjectionTimestamp != null && noInjectionTimestamp == modificationCount) {
    result = null;
  }
  else {
    data = anchor.getUserData(INJECTED_PSI_IN_CONCATENATION);

    result = data == null ? null : data.getValue(context);
    if (result == null || !result.isValid()) {
      result = doCompute(containingFile, project, anchor, operands);
    }
  }
  if (result != null) {
    ((InjectionRegistrarImpl)registrar).addToResults(result);

    if (data == null) {
      CachedValueProvider.Result<InjectionResult> cachedResult = CachedValueProvider.Result.create(result, manager);
      data = CachedValuesManager.getManager(project).createParameterizedCachedValue(context1 -> {
        PsiFile containingFile1 = context1.getContainingFile();
        Project project1 = containingFile1.getProject();
        Pair<PsiElement, PsiElement[]> pair1 = computeAnchorAndOperands(context1);
        InjectionResult result1 = pair1.second.length == 0 ? null : doCompute(containingFile1, project1, pair1.first, pair1.second);
        return result1 == null ? null : CachedValueProvider.Result.create(result1, manager);
      }, false);
      ((PsiParameterizedCachedValue<InjectionResult, PsiElement>)data).setValue(cachedResult);

      anchor.putUserData(INJECTED_PSI_IN_CONCATENATION, data);
      if (anchor.getUserData(NO_CONCAT_INJECTION_TIMESTAMP) != null) {
        anchor.putUserData(NO_CONCAT_INJECTION_TIMESTAMP, null);
      }
    }
  }
  else {
    // cache no-injection flag
    if (anchor.getUserData(INJECTED_PSI_IN_CONCATENATION) != null) {
      anchor.putUserData(INJECTED_PSI_IN_CONCATENATION, null);
    }
    anchor.putUserData(NO_CONCAT_INJECTION_TIMESTAMP, (int)modificationCount);
  }
}
 
Example #14
Source File: InjectionRegistrarImpl.java    From consulo with Apache License 2.0 4 votes vote down vote up
@Override
public MultiHostRegistrar startInjecting(@Nonnull Language language) {
  return startInjecting(LanguageVersionUtil.findDefaultVersion(language));
}
 
Example #15
Source File: InjectionRegistrarImpl.java    From consulo with Apache License 2.0 4 votes vote down vote up
@Nonnull
@Override
public MultiHostRegistrar startInjecting(@Nonnull LanguageVersion languageVersion) {
  return startInjecting(languageVersion, null);
}
 
Example #16
Source File: RTJSInjector.java    From react-templates-plugin with MIT License 4 votes vote down vote up
private static void inject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context, TextRange textRange) {
    registrar.startInjecting(RTLanguage.INSTANCE)
            .addPlace(null, null, (PsiLanguageInjectionHost) context, textRange)
            .doneInjecting();
}
 
Example #17
Source File: GraphQLTemplateFragmentLanguageInjector.java    From js-graphql-intellij-plugin with MIT License 4 votes vote down vote up
@Override
public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) {


    if(GraphQLLanguageInjectionUtil.isJSGraphQLLanguageInjectionTarget(context)) {

        final JSStringTemplateExpression template = (JSStringTemplateExpression)context;

        final TextRange graphQlTextRange = GraphQLLanguageInjectionUtil.getGraphQLTextRange(template);
        if(graphQlTextRange.isEmpty()) {
            // all whitespace
            return;
        }

        registrar.startInjecting(GraphQLLanguage.INSTANCE);

        final StringBuilder sb = new StringBuilder();
        final TextRange[] stringRanges = template.getStringRanges();
        int stringIndex = 0;
        boolean insideTemplate = false;
        for (ASTNode astNode : template.getNode().getChildren(null)) {
            if(astNode.getElementType() == JSTokenTypes.BACKQUOTE) {
                insideTemplate = true;
                continue;
            }
            if(astNode.getElementType() == JSTokenTypes.STRING_TEMPLATE_PART) {
                registrar.addPlace(sb.toString(), "", (PsiLanguageInjectionHost) template, stringRanges[stringIndex]);
                stringIndex++;
                sb.setLength(0);
            } else if(insideTemplate) {
                sb.append(astNode.getText());
            }
        }

        registrar.doneInjecting();

        // update graphql config notifications
        final VirtualFile virtualFile = context.getContainingFile().getVirtualFile();
        if(virtualFile != null && !ApplicationManager.getApplication().isUnitTestMode()) {
            EditorNotifications.getInstance(context.getProject()).updateNotifications(virtualFile);
        }
    }
}
 
Example #18
Source File: RTJSInjector.java    From react-templates-plugin with MIT License 4 votes vote down vote up
private static void inject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context, TextRange textRange) {
    registrar.startInjecting(RTLanguage.INSTANCE)
            .addPlace(null, null, (PsiLanguageInjectionHost) context, textRange)
            .doneInjecting();
}