From 504b4e9b9adf4e2c2d88b1f754200f4ea257dcef Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Tue, 25 Feb 2020 22:04:30 +0300 Subject: [PATCH] EA-222766 support cases when PsiDeclaredTarget#getNavigationElement differs from element which was used to obtain target GitOrigin-RevId: 7a48175b460115d7bf1862b017d3e89727333e99 --- .../psi/impl/PsiElement2Declaration.java | 17 +++++++-- ...PluginXmlIdentifierHighlightingTest.groovy | 36 +++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/codeInsight/PluginXmlIdentifierHighlightingTest.groovy diff --git a/platform/lang-impl/src/com/intellij/model/psi/impl/PsiElement2Declaration.java b/platform/lang-impl/src/com/intellij/model/psi/impl/PsiElement2Declaration.java index e1541e4ff312..9f4dcfc76839 100644 --- a/platform/lang-impl/src/com/intellij/model/psi/impl/PsiElement2Declaration.java +++ b/platform/lang-impl/src/com/intellij/model/psi/impl/PsiElement2Declaration.java @@ -4,6 +4,7 @@ package com.intellij.model.psi.impl; import com.intellij.model.Symbol; import com.intellij.model.psi.PsiSymbolDeclaration; import com.intellij.model.psi.PsiSymbolService; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.TextRange; import com.intellij.pom.PomTarget; import com.intellij.pom.PsiDeclaredTarget; @@ -15,6 +16,8 @@ import org.jetbrains.annotations.Nullable; class PsiElement2Declaration implements PsiSymbolDeclaration { + private static final Logger LOG = Logger.getInstance(PsiElement2Declaration.class); + private final PsiElement myTargetElement; private final PsiElement myDeclaringElement; private final TextRange myDeclarationRange; @@ -82,10 +85,18 @@ class PsiElement2Declaration implements PsiSymbolDeclaration { @NotNull private static TextRange getDeclarationRangeFromPom(@NotNull PomTarget target, @NotNull PsiElement declaringElement) { if (target instanceof PsiDeclaredTarget) { - assert ((PsiDeclaredTarget)target).getNavigationElement() == declaringElement; - TextRange nameIdentifierRange = ((PsiDeclaredTarget)target).getNameIdentifierRange(); + PsiDeclaredTarget declaredTarget = (PsiDeclaredTarget)target; + TextRange nameIdentifierRange = declaredTarget.getNameIdentifierRange(); if (nameIdentifierRange != null) { - return nameIdentifierRange; + PsiElement navigationElement = declaredTarget.getNavigationElement(); + if (navigationElement == declaringElement) { + return nameIdentifierRange; + } + else { + LOG.assertTrue(navigationElement.getContainingFile() == declaringElement.getContainingFile()); + int delta = declaringElement.getTextRange().getStartOffset() - navigationElement.getTextRange().getStartOffset(); + return nameIdentifierRange.shiftLeft(delta); + } } } return rangeOf(declaringElement); diff --git a/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/codeInsight/PluginXmlIdentifierHighlightingTest.groovy b/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/codeInsight/PluginXmlIdentifierHighlightingTest.groovy new file mode 100644 index 000000000000..7de3a2cac1ca --- /dev/null +++ b/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/codeInsight/PluginXmlIdentifierHighlightingTest.groovy @@ -0,0 +1,36 @@ +// 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 org.jetbrains.idea.devkit.codeInsight + +import com.intellij.codeInsight.daemon.impl.HighlightInfoType +import com.intellij.codeInsight.daemon.impl.IdentifierHighlighterPassFactory +import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase +import groovy.transform.CompileStatic + +@CompileStatic +class PluginXmlIdentifierHighlightingTest extends LightJavaCodeInsightFixtureTestCase { + + @Override + protected void setUp() throws Exception { + super.setUp() + myFixture.readEditorMarkupModel = true + } + + void 'test ep references'() { + myFixture.configureByText 'plugin.xml', '''\ + + + + + + + + +''' + IdentifierHighlighterPassFactory.doWithHighlightingEnabled { + def infos = myFixture.doHighlighting() + assert infos.findAll { + it.severity == HighlightInfoType.ELEMENT_UNDER_CARET_SEVERITY + }.size() == 2 + } + } +}