Highlighting: Add line markers for suspend function calls in coroutines
#KT-14689 Fixed
This commit is contained in:
@@ -45,5 +45,7 @@ public interface KotlinIcons {
|
|||||||
Icon CLASS_INITIALIZER = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/classInitializerKotlin.png");
|
Icon CLASS_INITIALIZER = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/classInitializerKotlin.png");
|
||||||
Icon TYPE_ALIAS = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/typeAlias.png");
|
Icon TYPE_ALIAS = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/typeAlias.png");
|
||||||
|
|
||||||
|
Icon SUSPEND_CALL = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/suspendCall.png");
|
||||||
|
|
||||||
Icon LAUNCH = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/kotlin_launch_configuration.png");
|
Icon LAUNCH = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/kotlin_launch_configuration.png");
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 254 B |
Binary file not shown.
|
After Width: | Height: | Size: 397 B |
@@ -545,6 +545,7 @@
|
|||||||
|
|
||||||
<codeInsight.lineMarkerProvider language="kotlin" implementationClass="org.jetbrains.kotlin.idea.highlighter.markers.KotlinLineMarkerProvider"/>
|
<codeInsight.lineMarkerProvider language="kotlin" implementationClass="org.jetbrains.kotlin.idea.highlighter.markers.KotlinLineMarkerProvider"/>
|
||||||
<codeInsight.lineMarkerProvider language="kotlin" implementationClass="org.jetbrains.kotlin.idea.highlighter.KotlinRecursiveCallLineMarkerProvider"/>
|
<codeInsight.lineMarkerProvider language="kotlin" implementationClass="org.jetbrains.kotlin.idea.highlighter.KotlinRecursiveCallLineMarkerProvider"/>
|
||||||
|
<codeInsight.lineMarkerProvider language="kotlin" implementationClass="org.jetbrains.kotlin.idea.highlighter.KotlinSuspendCallLineMarkerProvider"/>
|
||||||
<runLineMarkerContributor language="kotlin" implementationClass="org.jetbrains.kotlin.idea.highlighter.KotlinRunLineMarkerContributor"/>
|
<runLineMarkerContributor language="kotlin" implementationClass="org.jetbrains.kotlin.idea.highlighter.KotlinRunLineMarkerContributor"/>
|
||||||
<runLineMarkerContributor language="kotlin" implementationClass="org.jetbrains.kotlin.idea.highlighter.KotlinTestRunLineMarkerContributor"/>
|
<runLineMarkerContributor language="kotlin" implementationClass="org.jetbrains.kotlin.idea.highlighter.KotlinTestRunLineMarkerContributor"/>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2016 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.highlighter
|
||||||
|
|
||||||
|
import com.intellij.codeHighlighting.Pass
|
||||||
|
import com.intellij.codeInsight.daemon.LineMarkerInfo
|
||||||
|
import com.intellij.codeInsight.daemon.LineMarkerProvider
|
||||||
|
import com.intellij.openapi.editor.markup.GutterIconRenderer
|
||||||
|
import com.intellij.openapi.progress.ProgressManager
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
|
import org.jetbrains.kotlin.idea.KotlinIcons
|
||||||
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
|
import org.jetbrains.kotlin.idea.refactoring.getLineNumber
|
||||||
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||||
|
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||||
|
|
||||||
|
class KotlinSuspendCallLineMarkerProvider : LineMarkerProvider {
|
||||||
|
private class SuspendCallMarkerInfo(callElement: KtElement) : LineMarkerInfo<KtElement>(
|
||||||
|
callElement,
|
||||||
|
callElement.textRange,
|
||||||
|
KotlinIcons.SUSPEND_CALL,
|
||||||
|
Pass.UPDATE_OVERRIDDEN_MARKERS,
|
||||||
|
{ "Suspend function call" },
|
||||||
|
null,
|
||||||
|
GutterIconRenderer.Alignment.RIGHT
|
||||||
|
) {
|
||||||
|
override fun createGutterRenderer(): GutterIconRenderer? {
|
||||||
|
return object : LineMarkerInfo.LineMarkerGutterIconRenderer<KtElement>(this) {
|
||||||
|
override fun getClickAction() = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getLineMarkerInfo(element: PsiElement) = null
|
||||||
|
|
||||||
|
override fun collectSlowLineMarkers(
|
||||||
|
elements: MutableList<PsiElement>,
|
||||||
|
result: MutableCollection<LineMarkerInfo<*>>
|
||||||
|
) {
|
||||||
|
val markedLineNumbers = HashSet<Int>()
|
||||||
|
|
||||||
|
for (element in elements) {
|
||||||
|
ProgressManager.checkCanceled()
|
||||||
|
|
||||||
|
if (element !is KtElement) continue
|
||||||
|
|
||||||
|
val lineNumber = element.getLineNumber()
|
||||||
|
if (lineNumber in markedLineNumbers) continue
|
||||||
|
|
||||||
|
val resolvedCall = element.getResolvedCall(element.analyze(BodyResolveMode.PARTIAL)) ?: continue
|
||||||
|
val calleeDescriptor = resolvedCall.resultingDescriptor as? FunctionDescriptor ?: continue
|
||||||
|
if (!calleeDescriptor.isSuspend) continue
|
||||||
|
|
||||||
|
markedLineNumbers += lineNumber
|
||||||
|
result += SuspendCallMarkerInfo(element)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
suspend fun fff() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun ggg() {
|
||||||
|
return <lineMarker descr="Suspend function call">fff</lineMarker>()
|
||||||
|
}
|
||||||
@@ -320,4 +320,19 @@ public class LineMarkersTestGenerated extends AbstractLineMarkersTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("idea/testData/codeInsight/lineMarker/suspendCall")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class SuspendCall extends AbstractLineMarkersTest {
|
||||||
|
public void testAllFilesPresentInSuspendCall() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/codeInsight/lineMarker/suspendCall"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("suspendCall.kt")
|
||||||
|
public void testSuspendCall() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/lineMarker/suspendCall/suspendCall.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user