@Nullable
  @Override
  public PsiElement[] getGotoDeclarationTargets(PsiElement psiElement, int i, Editor editor) {

    if (!Symfony2ProjectComponent.isEnabled(psiElement)) {
      return null;
    }

    // only string values like "foo", foo
    if (!PlatformPatterns.psiElement(YAMLTokenTypes.TEXT)
            .withLanguage(YAMLLanguage.INSTANCE)
            .accepts(psiElement)
        && !PlatformPatterns.psiElement(YAMLTokenTypes.SCALAR_DSTRING)
            .withLanguage(YAMLLanguage.INSTANCE)
            .accepts(psiElement)
        && !PlatformPatterns.psiElement(YAMLTokenTypes.SCALAR_STRING)
            .withLanguage(YAMLLanguage.INSTANCE)
            .accepts(psiElement)) {

      return new PsiElement[] {};
    }

    String psiText = PsiElementUtils.getText(psiElement);
    if (null == psiText || psiText.length() == 0) {
      return new PsiElement[] {};
    }

    List<PsiElement> psiElements = new ArrayList<PsiElement>();

    if (psiText.startsWith("@") && psiText.length() > 1) {
      psiElements.addAll(Arrays.asList((serviceGoToDeclaration(psiElement, psiText.substring(1)))));
    }

    // match: %annotations.reader.class%
    if (psiText.length() > 3 && psiText.startsWith("%") && psiText.endsWith("%")) {
      psiElements.addAll(Arrays.asList((parameterGoToDeclaration(psiElement, psiText))));
    }

    if (psiText.contains("\\")) {
      psiElements.addAll(classGoToDeclaration(psiElement, psiText));
    }

    if (psiText.endsWith(".twig") || psiText.endsWith(".php")) {
      psiElements.addAll(templateGoto(psiElement, psiText));
    }

    if (psiText.matches("^[\\w_.]+") && getGlobalServiceStringPattern().accepts(psiElement)) {
      psiElements.addAll(Arrays.asList((serviceGoToDeclaration(psiElement, psiText))));
    }

    return psiElements.toArray(new PsiElement[psiElements.size()]);
  }