WEB-67976 Fixed size and margins of hints in JS / TS

GitOrigin-RevId: d3eca9bfc99645acce41082b6b1494d3e0d72e49
This commit is contained in:
Aleksei Berezkin
2024-07-09 15:49:42 +02:00
committed by intellij-monorepo-bot
parent b3ecaee10d
commit 45d568dda4
21 changed files with 171 additions and 121 deletions

View File

@@ -1254,6 +1254,28 @@ e:com.intellij.codeInsight.hints.declarative.HintColorKind
- f:hasBackground():Z
- s:valueOf(java.lang.String):com.intellij.codeInsight.hints.declarative.HintColorKind
- s:values():com.intellij.codeInsight.hints.declarative.HintColorKind[]
e:com.intellij.codeInsight.hints.declarative.HintFontSize
- java.lang.Enum
- sf:ABitSmallerThanInEditor:com.intellij.codeInsight.hints.declarative.HintFontSize
- sf:AsInEditor:com.intellij.codeInsight.hints.declarative.HintFontSize
- s:getEntries():kotlin.enums.EnumEntries
- s:valueOf(java.lang.String):com.intellij.codeInsight.hints.declarative.HintFontSize
- s:values():com.intellij.codeInsight.hints.declarative.HintFontSize[]
f:com.intellij.codeInsight.hints.declarative.HintFormat
- sf:Companion:com.intellij.codeInsight.hints.declarative.HintFormat$Companion
- <init>(com.intellij.codeInsight.hints.declarative.HintColorKind,com.intellij.codeInsight.hints.declarative.HintFontSize):V
- f:component1():com.intellij.codeInsight.hints.declarative.HintColorKind
- f:component2():com.intellij.codeInsight.hints.declarative.HintFontSize
- f:copy(com.intellij.codeInsight.hints.declarative.HintColorKind,com.intellij.codeInsight.hints.declarative.HintFontSize):com.intellij.codeInsight.hints.declarative.HintFormat
- bs:copy$default(com.intellij.codeInsight.hints.declarative.HintFormat,com.intellij.codeInsight.hints.declarative.HintColorKind,com.intellij.codeInsight.hints.declarative.HintFontSize,I,java.lang.Object):com.intellij.codeInsight.hints.declarative.HintFormat
- equals(java.lang.Object):Z
- f:getColorKind():com.intellij.codeInsight.hints.declarative.HintColorKind
- f:getFontSize():com.intellij.codeInsight.hints.declarative.HintFontSize
- hashCode():I
- f:withColorKind(com.intellij.codeInsight.hints.declarative.HintColorKind):com.intellij.codeInsight.hints.declarative.HintFormat
- f:withFontSize(com.intellij.codeInsight.hints.declarative.HintFontSize):com.intellij.codeInsight.hints.declarative.HintFormat
f:com.intellij.codeInsight.hints.declarative.HintFormat$Companion
- f:getDefault():com.intellij.codeInsight.hints.declarative.HintFormat
f:com.intellij.codeInsight.hints.declarative.InlayActionData
- <init>(com.intellij.codeInsight.hints.declarative.InlayActionPayload,java.lang.String):V
- equals(java.lang.Object):Z
@@ -1387,9 +1409,9 @@ f:com.intellij.codeInsight.hints.declarative.InlayProviderPassInfo
- f:getProvider():com.intellij.codeInsight.hints.declarative.InlayHintsProvider
- f:getProviderId():java.lang.String
com.intellij.codeInsight.hints.declarative.InlayTreeSink
- a:addPresentation(com.intellij.codeInsight.hints.declarative.InlayPosition,java.util.List,java.lang.String,com.intellij.codeInsight.hints.declarative.HintColorKind,kotlin.jvm.functions.Function1):V
- a:addPresentation(com.intellij.codeInsight.hints.declarative.InlayPosition,java.util.List,java.lang.String,com.intellij.codeInsight.hints.declarative.HintFormat,kotlin.jvm.functions.Function1):V
- addPresentation(com.intellij.codeInsight.hints.declarative.InlayPosition,java.util.List,java.lang.String,Z,kotlin.jvm.functions.Function1):V
- bs:addPresentation$default(com.intellij.codeInsight.hints.declarative.InlayTreeSink,com.intellij.codeInsight.hints.declarative.InlayPosition,java.util.List,java.lang.String,com.intellij.codeInsight.hints.declarative.HintColorKind,kotlin.jvm.functions.Function1,I,java.lang.Object):V
- bs:addPresentation$default(com.intellij.codeInsight.hints.declarative.InlayTreeSink,com.intellij.codeInsight.hints.declarative.InlayPosition,java.util.List,java.lang.String,com.intellij.codeInsight.hints.declarative.HintFormat,kotlin.jvm.functions.Function1,I,java.lang.Object):V
- bs:addPresentation$default(com.intellij.codeInsight.hints.declarative.InlayTreeSink,com.intellij.codeInsight.hints.declarative.InlayPosition,java.util.List,java.lang.String,Z,kotlin.jvm.functions.Function1,I,java.lang.Object):V
- a:whenOptionEnabled(java.lang.String,kotlin.jvm.functions.Function0):V
f:com.intellij.codeInsight.hints.declarative.InlineInlayPosition

View File

@@ -1,11 +0,0 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.hints.declarative
/**
* Editor | Color Scheme | Language Defaults | Inline hints
*/
enum class HintColorKind {
Default, Parameter, TextWithoutBackground;
fun hasBackground() = this != TextWithoutBackground
}

View File

@@ -0,0 +1,31 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.hints.declarative
data class HintFormat(
val colorKind: HintColorKind,
val fontSize: HintFontSize,
) {
companion object {
val default = HintFormat(
HintColorKind.Default,
HintFontSize.AsInEditor,
)
}
fun withColorKind(newColorKind: HintColorKind) = copy(colorKind = newColorKind)
fun withFontSize(newFontSize: HintFontSize) = copy(fontSize = newFontSize)
}
/**
* Editor | Color Scheme | Language Defaults | Inline hints
*/
enum class HintColorKind {
Default, Parameter, TextWithoutBackground;
fun hasBackground() = this != TextWithoutBackground
}
enum class HintFontSize {
AsInEditor,
ABitSmallerThanInEditor
}

View File

@@ -14,7 +14,7 @@ interface InlayTreeSink {
addPresentation(position,
payloads,
tooltip,
if (hasBackground) HintColorKind.Default else HintColorKind.TextWithoutBackground,
if (hasBackground) HintFormat.default else HintFormat.default.withColorKind(HintColorKind.TextWithoutBackground),
builder)
}
@@ -25,7 +25,7 @@ interface InlayTreeSink {
fun addPresentation(position: InlayPosition,
payloads: List<InlayPayload>? = null,
tooltip: String? = null,
hintColorKind: HintColorKind,
hintFormat: HintFormat,
builder: PresentationTreeBuilder.() -> Unit)
/**

View File

@@ -6458,6 +6458,7 @@ a:com.intellij.codeInsight.hints.chain.AbstractDeclarativeCallChainProvider
- pa:buildTree(java.lang.Object,com.intellij.psi.PsiElement,com.intellij.openapi.project.Project,java.lang.Object,com.intellij.codeInsight.hints.declarative.PresentationTreeBuilder):V
- createCollector(com.intellij.psi.PsiFile,com.intellij.openapi.editor.Editor):com.intellij.codeInsight.hints.declarative.InlayHintsCollector
- pa:getDotQualifiedClass():java.lang.Class
- p:getHintFormat():com.intellij.codeInsight.hints.declarative.HintFormat
- pa:getParentDotQualifiedExpression(com.intellij.psi.PsiElement):com.intellij.psi.PsiElement
- pa:getReceiver(com.intellij.psi.PsiElement):com.intellij.psi.PsiElement
- pa:getType(com.intellij.psi.PsiElement,java.lang.Object):java.lang.Object
@@ -6663,23 +6664,23 @@ f:com.intellij.codeInsight.hints.declarative.impl.DeclarativeInlayRenderer
- f:handleRightClick(com.intellij.openapi.editor.event.EditorMouseEvent):V
- paint(com.intellij.openapi.editor.Inlay,java.awt.Graphics2D,java.awt.geom.Rectangle2D,com.intellij.openapi.editor.markup.TextAttributes):V
- f:setInlay(com.intellij.openapi.editor.Inlay):V
- f:updateState(com.intellij.codeInsight.hints.declarative.impl.util.TinyTree,Z,com.intellij.codeInsight.hints.declarative.HintColorKind):V
- f:updateState(com.intellij.codeInsight.hints.declarative.impl.util.TinyTree,Z,com.intellij.codeInsight.hints.declarative.HintFormat):V
f:com.intellij.codeInsight.hints.declarative.impl.InlayData
- <init>(com.intellij.codeInsight.hints.declarative.InlayPosition,java.lang.String,com.intellij.codeInsight.hints.declarative.HintColorKind,com.intellij.codeInsight.hints.declarative.impl.util.TinyTree,java.lang.String,Z,java.util.List,java.lang.Class,java.lang.String):V
- <init>(com.intellij.codeInsight.hints.declarative.InlayPosition,java.lang.String,com.intellij.codeInsight.hints.declarative.HintFormat,com.intellij.codeInsight.hints.declarative.impl.util.TinyTree,java.lang.String,Z,java.util.List,java.lang.Class,java.lang.String):V
- f:component1():com.intellij.codeInsight.hints.declarative.InlayPosition
- f:component2():java.lang.String
- f:component3():com.intellij.codeInsight.hints.declarative.HintColorKind
- f:component3():com.intellij.codeInsight.hints.declarative.HintFormat
- f:component4():com.intellij.codeInsight.hints.declarative.impl.util.TinyTree
- f:component5():java.lang.String
- f:component6():Z
- f:component7():java.util.List
- f:component8():java.lang.Class
- f:component9():java.lang.String
- f:copy(com.intellij.codeInsight.hints.declarative.InlayPosition,java.lang.String,com.intellij.codeInsight.hints.declarative.HintColorKind,com.intellij.codeInsight.hints.declarative.impl.util.TinyTree,java.lang.String,Z,java.util.List,java.lang.Class,java.lang.String):com.intellij.codeInsight.hints.declarative.impl.InlayData
- bs:copy$default(com.intellij.codeInsight.hints.declarative.impl.InlayData,com.intellij.codeInsight.hints.declarative.InlayPosition,java.lang.String,com.intellij.codeInsight.hints.declarative.HintColorKind,com.intellij.codeInsight.hints.declarative.impl.util.TinyTree,java.lang.String,Z,java.util.List,java.lang.Class,java.lang.String,I,java.lang.Object):com.intellij.codeInsight.hints.declarative.impl.InlayData
- f:copy(com.intellij.codeInsight.hints.declarative.InlayPosition,java.lang.String,com.intellij.codeInsight.hints.declarative.HintFormat,com.intellij.codeInsight.hints.declarative.impl.util.TinyTree,java.lang.String,Z,java.util.List,java.lang.Class,java.lang.String):com.intellij.codeInsight.hints.declarative.impl.InlayData
- bs:copy$default(com.intellij.codeInsight.hints.declarative.impl.InlayData,com.intellij.codeInsight.hints.declarative.InlayPosition,java.lang.String,com.intellij.codeInsight.hints.declarative.HintFormat,com.intellij.codeInsight.hints.declarative.impl.util.TinyTree,java.lang.String,Z,java.util.List,java.lang.Class,java.lang.String,I,java.lang.Object):com.intellij.codeInsight.hints.declarative.impl.InlayData
- equals(java.lang.Object):Z
- f:getDisabled():Z
- f:getHintColorKind():com.intellij.codeInsight.hints.declarative.HintColorKind
- f:getHintFormat():com.intellij.codeInsight.hints.declarative.HintFormat
- f:getPayloads():java.util.List
- f:getPosition():com.intellij.codeInsight.hints.declarative.InlayPosition
- f:getProviderClass():java.lang.Class
@@ -6702,23 +6703,32 @@ f:com.intellij.codeInsight.hints.declarative.impl.InlayMouseArea
- f:getEntries():java.util.List
f:com.intellij.codeInsight.hints.declarative.impl.InlayPresentationList
- sf:Companion:com.intellij.codeInsight.hints.declarative.impl.InlayPresentationList$Companion
- <init>(com.intellij.codeInsight.hints.declarative.impl.util.TinyTree,com.intellij.codeInsight.hints.declarative.HintColorKind,Z,java.util.Map,java.lang.Class,java.lang.String,java.lang.String):V
- b:<init>(com.intellij.codeInsight.hints.declarative.impl.util.TinyTree,com.intellij.codeInsight.hints.declarative.HintColorKind,Z,java.util.Map,java.lang.Class,java.lang.String,java.lang.String,I,kotlin.jvm.internal.DefaultConstructorMarker):V
- <init>(com.intellij.codeInsight.hints.declarative.impl.util.TinyTree,com.intellij.codeInsight.hints.declarative.HintFormat,Z,java.util.Map,java.lang.Class,java.lang.String,java.lang.String):V
- b:<init>(com.intellij.codeInsight.hints.declarative.impl.util.TinyTree,com.intellij.codeInsight.hints.declarative.HintFormat,Z,java.util.Map,java.lang.Class,java.lang.String,java.lang.String,I,kotlin.jvm.internal.DefaultConstructorMarker):V
- f:getEntries():com.intellij.codeInsight.hints.declarative.impl.InlayPresentationEntry[]
- f:getHintColorKind():com.intellij.codeInsight.hints.declarative.HintColorKind
- f:getHintFormat():com.intellij.codeInsight.hints.declarative.HintFormat
- f:getMouseArea(java.awt.Point,com.intellij.codeInsight.hints.presentation.InlayTextMetricsStorage):com.intellij.codeInsight.hints.declarative.impl.InlayMouseArea
- f:getPayloads():java.util.Map
- f:getWidthInPixels(com.intellij.codeInsight.hints.presentation.InlayTextMetricsStorage):I
- f:getWidthInPixels(com.intellij.codeInsight.hints.presentation.InlayTextMetricsStorage):com.intellij.codeInsight.hints.declarative.impl.InlayPresentationList$DeclarativeHintWidth
- f:handleClick(com.intellij.openapi.editor.event.EditorMouseEvent,java.awt.Point,com.intellij.codeInsight.hints.presentation.InlayTextMetricsStorage,Z):V
- f:handleHover(com.intellij.openapi.editor.event.EditorMouseEvent):com.intellij.ui.LightweightHint
- f:isDisabled():Z
- f:paint(com.intellij.openapi.editor.Inlay,java.awt.Graphics2D,java.awt.geom.Rectangle2D,com.intellij.openapi.editor.markup.TextAttributes):V
- f:setDisabled(Z):V
- f:setHintColorKind(com.intellij.codeInsight.hints.declarative.HintColorKind):V
- f:setHintFormat(com.intellij.codeInsight.hints.declarative.HintFormat):V
- f:setPayloads(java.util.Map):V
- f:toggleTreeState(B):V
- f:updateState(com.intellij.codeInsight.hints.declarative.impl.util.TinyTree,Z,com.intellij.codeInsight.hints.declarative.HintColorKind):V
- f:updateState(com.intellij.codeInsight.hints.declarative.impl.util.TinyTree,Z,com.intellij.codeInsight.hints.declarative.HintFormat):V
f:com.intellij.codeInsight.hints.declarative.impl.InlayPresentationList$Companion
f:com.intellij.codeInsight.hints.declarative.impl.InlayPresentationList$DeclarativeHintWidth
- <init>(I,I,I):V
- f:copy(I,I,I):com.intellij.codeInsight.hints.declarative.impl.InlayPresentationList$DeclarativeHintWidth
- bs:copy$default(com.intellij.codeInsight.hints.declarative.impl.InlayPresentationList$DeclarativeHintWidth,I,I,I,I,java.lang.Object):com.intellij.codeInsight.hints.declarative.impl.InlayPresentationList$DeclarativeHintWidth
- equals(java.lang.Object):Z
- f:getBoxWidth():I
- f:getFullWidth():I
- f:getMarginAndPadding():I
- hashCode():I
f:com.intellij.codeInsight.hints.declarative.impl.InlayTags
- sf:CLICK_HANDLER_SCOPE_TAG:B
- sf:COLLAPSE_BUTTON_TAG:B
@@ -6735,7 +6745,7 @@ f:com.intellij.codeInsight.hints.declarative.impl.InlayTags
f:com.intellij.codeInsight.hints.declarative.impl.InlayTreeSinkImpl
- com.intellij.codeInsight.hints.declarative.InlayTreeSink
- <init>(java.lang.String,java.util.Map,Z,Z,java.lang.Class,java.lang.String):V
- addPresentation(com.intellij.codeInsight.hints.declarative.InlayPosition,java.util.List,java.lang.String,com.intellij.codeInsight.hints.declarative.HintColorKind,kotlin.jvm.functions.Function1):V
- addPresentation(com.intellij.codeInsight.hints.declarative.InlayPosition,java.util.List,java.lang.String,com.intellij.codeInsight.hints.declarative.HintFormat,kotlin.jvm.functions.Function1):V
- f:finish():java.util.List
- whenOptionEnabled(java.lang.String,kotlin.jvm.functions.Function0):V
f:com.intellij.codeInsight.hints.declarative.impl.PresentationEntryBuilder
@@ -6759,13 +6769,13 @@ f:com.intellij.codeInsight.hints.declarative.impl.PresentationTreeBuilderImpl$Co
f:com.intellij.codeInsight.hints.declarative.impl.TextInlayPresentationEntry
- <init>(java.lang.String,B,com.intellij.codeInsight.hints.declarative.impl.InlayMouseArea):V
- b:<init>(java.lang.String,B,com.intellij.codeInsight.hints.declarative.impl.InlayMouseArea,I,kotlin.jvm.internal.DefaultConstructorMarker):V
- computeHeight(com.intellij.codeInsight.hints.presentation.InlayTextMetricsStorage):I
- computeWidth(com.intellij.codeInsight.hints.presentation.InlayTextMetricsStorage):I
- computeHeight(com.intellij.codeInsight.hints.presentation.InlayTextMetrics):I
- computeWidth(com.intellij.codeInsight.hints.presentation.InlayTextMetrics):I
- equals(java.lang.Object):Z
- f:getText():java.lang.String
- handleClick(com.intellij.openapi.editor.Editor,com.intellij.codeInsight.hints.declarative.impl.InlayPresentationList,Z):V
- hashCode():I
- render(java.awt.Graphics2D,com.intellij.codeInsight.hints.presentation.InlayTextMetricsStorage,com.intellij.openapi.editor.markup.TextAttributes,Z,I,I,com.intellij.openapi.editor.Editor):V
- render(java.awt.Graphics2D,com.intellij.codeInsight.hints.presentation.InlayTextMetrics,com.intellij.openapi.editor.markup.TextAttributes,Z,I,I,com.intellij.openapi.editor.Editor):V
f:com.intellij.codeInsight.hints.declarative.impl.toggle.DeclarativeHintsTogglingIntention
- com.intellij.codeInsight.intention.IntentionAction
- com.intellij.codeInsight.intention.LowPriorityAction

View File

@@ -62,7 +62,7 @@ abstract class AbstractDeclarativeCallChainProvider<DotQualifiedExpression : Psi
if (reversedChain.asSequence().distinctBy { it.type }.count() < uniqueTypeCount) return
for ((expression, type) in reversedChain) {
sink.addPresentation(InlineInlayPosition(expression.textRange.endOffset, relatedToPrevious = true), hasBackground = true) {
sink.addPresentation(InlineInlayPosition(expression.textRange.endOffset, relatedToPrevious = true), hintFormat = getHintFormat()) {
type.buildTree(expression, file.project, context, this)
}
}
@@ -70,6 +70,8 @@ abstract class AbstractDeclarativeCallChainProvider<DotQualifiedExpression : Psi
}
}
protected open fun getHintFormat(): HintFormat = HintFormat.default
protected abstract fun ExpressionType.buildTree(
expression: PsiElement,
project: Project,

View File

@@ -94,7 +94,7 @@ class DeclarativeInlayHintsPass(
val lineEndOffset = editor.document.getLineEndOffset(position.line)
val updated = tryUpdateAndDeleteFromListInlay(offsetToExistingEolElements, inlayData, lineEndOffset)
if (!updated) {
val presentationList = InlayPresentationList(inlayData.tree, inlayData.hintColorKind, inlayData.disabled,
val presentationList = InlayPresentationList(inlayData.tree, inlayData.hintFormat, inlayData.disabled,
createPayloads(inlayData), inlayData.providerClass, inlayData.tooltip, inlayData.sourceId)
val renderer = DeclarativeInlayRenderer(presentationList, storage, inlayData.providerId, position)
val inlay = inlayModel.addAfterLineEndElement(lineEndOffset, true, renderer)
@@ -106,7 +106,7 @@ class DeclarativeInlayHintsPass(
is InlineInlayPosition -> {
val updated = tryUpdateAndDeleteFromListInlay(offsetToExistingInlineElements, inlayData, position.offset)
if (!updated) {
val presentationList = InlayPresentationList(inlayData.tree, inlayData.hintColorKind, inlayData.disabled,
val presentationList = InlayPresentationList(inlayData.tree, inlayData.hintFormat, inlayData.disabled,
createPayloads(inlayData), inlayData.providerClass, inlayData.tooltip, inlayData.sourceId)
val renderer = DeclarativeInlayRenderer(presentationList, storage, inlayData.providerId, position)
val inlay = inlayModel.addInlineElement(position.offset, position.relatedToPrevious, position.priority, renderer)
@@ -145,7 +145,7 @@ class DeclarativeInlayHintsPass(
val existingInlay = iterator.next()
val renderer = existingInlay.renderer
if (renderer.providerId == inlayData.providerId) {
renderer.updateState(inlayData.tree, inlayData.disabled, inlayData.hintColorKind)
renderer.updateState(inlayData.tree, inlayData.disabled, inlayData.hintFormat)
existingInlay.update()
iterator.remove()
return true

View File

@@ -32,12 +32,12 @@ class DeclarativeInlayRenderer(
private var inlay: Inlay<DeclarativeInlayRenderer>? = null
override fun calcWidthInPixels(inlay: Inlay<*>): Int {
return presentationList.getWidthInPixels(fontMetricsStorage)
return presentationList.getWidthInPixels(fontMetricsStorage).fullWidth
}
@RequiresEdt
fun updateState(newState: TinyTree<Any?>, disabled: Boolean, hintColorKind: HintColorKind) {
presentationList.updateState(newState, disabled, hintColorKind)
fun updateState(newState: TinyTree<Any?>, disabled: Boolean, hintFormat: HintFormat) {
presentationList.updateState(newState, disabled, hintFormat)
}
override fun paint(inlay: Inlay<*>, g: Graphics2D, targetRegion: Rectangle2D, textAttributes: TextAttributes) {

View File

@@ -16,7 +16,7 @@ import java.io.DataOutput
data class InlayData(
val position: InlayPosition,
@NlsContexts.HintText val tooltip: String?,
val hintColorKind: HintColorKind,
val hintFormat: HintFormat,
val tree: TinyTree<Any?>,
val providerId: String,
val disabled: Boolean,
@@ -30,7 +30,7 @@ data class InlayData(
companion object {
// increment on format changed
private const val SERDE_VERSION = 4
private const val SERDE_VERSION = 5
}
override fun serdeVersion(): Int = SERDE_VERSION + treeExternalizer.serdeVersion()
@@ -38,7 +38,8 @@ data class InlayData(
override fun save(output: DataOutput, inlayData: InlayData) {
writePosition(output, inlayData.position)
writeTooltip(output, inlayData.tooltip)
output.writeUTF(inlayData.hintColorKind.name)
output.writeUTF(inlayData.hintFormat.colorKind.name)
output.writeUTF(inlayData.hintFormat.fontSize.name)
treeExternalizer.save(output, inlayData.tree)
writeUTF(output, inlayData.providerId)
output.writeBoolean(inlayData.disabled)
@@ -50,13 +51,14 @@ data class InlayData(
val position: InlayPosition = readPosition(input)
val tooltip: String? = readTooltip(input)
val hintColorKind: HintColorKind = HintColorKind.valueOf(input.readUTF())
val hintFontSize: HintFontSize = HintFontSize.valueOf(input.readUTF())
val tree: TinyTree<Any?> = treeExternalizer.read(input)
val providerId: String = readUTF(input)
val disabled: Boolean = input.readBoolean()
val payloads: List<InlayPayload>? = readPayloads(input)
val providerClass: Class<*> = ZombieInlayHintsProvider::class.java
val sourceId: String = readSourceId(input)
return InlayData(position, tooltip, hintColorKind, tree, providerId, disabled, payloads, providerClass, sourceId)
return InlayData(position, tooltip, HintFormat(hintColorKind, hintFontSize), tree, providerId, disabled, payloads, providerClass, sourceId)
}
private fun writePosition(output: DataOutput, position: InlayPosition) {

View File

@@ -2,7 +2,7 @@
package com.intellij.codeInsight.hints.declarative.impl
import com.intellij.codeInsight.hints.declarative.InlayActionHandler
import com.intellij.codeInsight.hints.presentation.InlayTextMetricsStorage
import com.intellij.codeInsight.hints.presentation.InlayTextMetrics
import com.intellij.ide.ui.AntialiasingType
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.markup.TextAttributes
@@ -20,7 +20,7 @@ sealed class InlayPresentationEntry(
) {
abstract fun render(
graphics: Graphics2D,
fontMetricsStorage: InlayTextMetricsStorage,
metrics: InlayTextMetrics,
attributes: TextAttributes,
isDisabled: Boolean,
yOffset: Int,
@@ -28,9 +28,9 @@ sealed class InlayPresentationEntry(
editor: Editor
)
abstract fun computeWidth(fontMetricsStorage: InlayTextMetricsStorage): Int
abstract fun computeWidth(metrics: InlayTextMetrics): Int
abstract fun computeHeight(fontMetricsStorage: InlayTextMetricsStorage): Int
abstract fun computeHeight(metrics: InlayTextMetrics): Int
abstract fun handleClick(editor: Editor, list: InlayPresentationList, controlDown: Boolean)
@@ -63,20 +63,19 @@ class TextInlayPresentationEntry(
}
override fun render(graphics: Graphics2D,
fontMetricsStorage: InlayTextMetricsStorage,
metrics: InlayTextMetrics,
attributes: TextAttributes,
isDisabled: Boolean,
yOffset: Int,
rectHeight: Int,
editor: Editor) {
val metrics = fontMetricsStorage.getFontMetrics(small = false)
val savedHint = graphics.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING)
val savedColor = graphics.color
try {
val foreground = attributes.foregroundColor
if (foreground != null) {
val width = computeWidth(fontMetricsStorage)
val height = computeHeight(fontMetricsStorage)
val width = computeWidth(metrics)
val height = computeHeight(metrics)
val font = metrics.font
graphics.font = font
graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AntialiasingType.getKeyForCurrentScope(false))
@@ -96,13 +95,9 @@ class TextInlayPresentationEntry(
}
}
override fun computeWidth(fontMetricsStorage: InlayTextMetricsStorage): Int {
return fontMetricsStorage.getFontMetrics(small = false).getStringWidth(text)
}
override fun computeWidth(metrics: InlayTextMetrics): Int = metrics.getStringWidth(text)
override fun computeHeight(fontMetricsStorage: InlayTextMetricsStorage): Int {
return fontMetricsStorage.getFontMetrics(small = false).fontHeight
}
override fun computeHeight(metrics: InlayTextMetrics): Int = metrics.fontHeight
override fun equals(other: Any?): Boolean {
if (this === other) return true

View File

@@ -2,11 +2,9 @@
package com.intellij.codeInsight.hints.declarative.impl
import com.intellij.codeInsight.hints.InlayHintsUtils
import com.intellij.codeInsight.hints.declarative.HintColorKind
import com.intellij.codeInsight.hints.declarative.InlayActionPayload
import com.intellij.codeInsight.hints.declarative.InlayPayload
import com.intellij.codeInsight.hints.declarative.InlayPosition
import com.intellij.codeInsight.hints.declarative.*
import com.intellij.codeInsight.hints.declarative.impl.util.TinyTree
import com.intellij.codeInsight.hints.presentation.InlayTextMetrics
import com.intellij.codeInsight.hints.presentation.InlayTextMetricsStorage
import com.intellij.codeInsight.hints.presentation.PresentationFactory
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors
@@ -30,7 +28,7 @@ import java.awt.geom.Rectangle2D
*/
class InlayPresentationList(
private var state: TinyTree<Any?>,
@TestOnly var hintColorKind: HintColorKind,
@TestOnly var hintFormat: HintFormat,
@TestOnly var isDisabled: Boolean,
var payloads: Map<String, InlayActionPayload>? = null,
private val providerClass: Class<*>,
@@ -38,11 +36,9 @@ class InlayPresentationList(
internal val sourceId: String,
) {
companion object {
private const val NOT_COMPUTED = -1
private const val LEFT_MARGIN = 7
private const val RIGHT_MARGIN = 7
private const val BOTTOM_MARGIN = 1
private const val TOP_MARGIN = 1
private val NOT_COMPUTED = DeclarativeHintWidth(-1, -1, -1)
private const val HORIZONTAL_PADDING = 6
private const val HORIZONTAL_MARGIN = 2
private const val ARC_WIDTH = 8
private const val ARC_HEIGHT = 8
private const val BACKGROUND_ALPHA: Float = 0.55f
@@ -50,7 +46,7 @@ class InlayPresentationList(
private var entries: Array<InlayPresentationEntry> = PresentationEntryBuilder(state, providerClass).buildPresentationEntries()
private var _partialWidthSums: IntArray? = null
private var computedWidth: Int = NOT_COMPUTED
private var computedWidth: DeclarativeHintWidth = NOT_COMPUTED
private var size: Float = Float.MAX_VALUE
private var fontName: String = ""
@@ -59,7 +55,7 @@ class InlayPresentationList(
return IntArray(entries.size) {
val entry = entries[it]
val oldWidth = width
width += entry.computeWidth(fontMetricsStorage)
width += entry.computeWidth(getMetrics(fontMetricsStorage))
oldWidth
}
}
@@ -82,9 +78,11 @@ class InlayPresentationList(
private fun findEntryByPoint(fontMetricsStorage: InlayTextMetricsStorage, pointInsideInlay: Point): InlayPresentationEntry? {
val x = pointInsideInlay.x
val partialWidthSums = getPartialWidthSums(fontMetricsStorage)
val hintWidth = getWidthInPixels(fontMetricsStorage)
for ((index, entry) in entries.withIndex()) {
val leftBound = partialWidthSums[index] + LEFT_MARGIN
val rightBound = partialWidthSums.getOrElse(index + 1) { Int.MAX_VALUE - LEFT_MARGIN } + LEFT_MARGIN
val leftBound = partialWidthSums[index] + hintWidth.marginAndPadding
val rightBound = partialWidthSums.getOrNull(index + 1)?.let { it + hintWidth.marginAndPadding }
?: Int.MAX_VALUE
if (x in leftBound..rightBound) {
return entry
@@ -99,14 +97,14 @@ class InlayPresentationList(
}
@RequiresEdt
fun updateState(state: TinyTree<Any?>, disabled: Boolean, hintColorKind: HintColorKind) {
fun updateState(state: TinyTree<Any?>, disabled: Boolean, hintFormat: HintFormat) {
updateStateTree(state, this.state, 0, 0)
this.state = state
this.entries = PresentationEntryBuilder(state, providerClass).buildPresentationEntries()
this.computedWidth = NOT_COMPUTED
this._partialWidthSums = null
this.isDisabled = disabled
this.hintColorKind = hintColorKind
this.hintFormat = hintFormat
}
private fun updateStateTree(treeToUpdate: TinyTree<Any?>,
@@ -145,48 +143,58 @@ class InlayPresentationList(
error("Unexpected payload: $payload")
}
}
updateState(state, isDisabled, hintColorKind)
updateState(state, isDisabled, hintFormat)
}
fun getWidthInPixels(textMetricsStorage: InlayTextMetricsStorage): Int {
val metrics = textMetricsStorage.getFontMetrics(true)
fun getWidthInPixels(textMetricsStorage: InlayTextMetricsStorage): DeclarativeHintWidth {
val metrics = getMetrics(textMetricsStorage)
val isActual = metrics.isActual(size, fontName)
if (!isActual || computedWidth == NOT_COMPUTED) {
size = metrics.font.size2D
fontName = metrics.font.family
val width = entries.sumOf { it.computeWidth(textMetricsStorage) } + LEFT_MARGIN + RIGHT_MARGIN
computedWidth = width
return width
val textWidth = entries.sumOf { it.computeWidth(metrics) }
computedWidth = DeclarativeHintWidth(HORIZONTAL_MARGIN, HORIZONTAL_PADDING, textWidth)
return computedWidth
}
return computedWidth
}
data class DeclarativeHintWidth(
internal val margin: Int,
internal val padding: Int,
internal val textWidth: Int,
) {
val marginAndPadding: Int get() = margin + padding
val boxWidth: Int get() = 2 * padding + textWidth
val fullWidth: Int get() = 2 * margin + boxWidth
}
fun paint(inlay: Inlay<*>, g: Graphics2D, targetRegion: Rectangle2D, textAttributes: TextAttributes) {
val editor = inlay.editor as EditorImpl
val storage = InlayHintsUtils.getTextMetricStorage(editor)
var xOffset = 0
val metrics = storage.getFontMetrics(small = false)
val metrics = getMetrics(storage)
val gap = if (targetRegion.height.toInt() < metrics.lineHeight + 2) 1 else 2
val attrKey = when (hintColorKind) {
val attrKey = when (hintFormat.colorKind) {
HintColorKind.Default -> DefaultLanguageHighlighterColors.INLAY_DEFAULT
HintColorKind.Parameter -> DefaultLanguageHighlighterColors.INLINE_PARAMETER_HINT
HintColorKind.TextWithoutBackground -> DefaultLanguageHighlighterColors.INLAY_TEXT_WITHOUT_BACKGROUND
}
val attrs = editor.colorsScheme.getAttributes(attrKey)
g.withTranslated(targetRegion.x, targetRegion.y) {
if (hintColorKind.hasBackground()) {
if (hintFormat.colorKind.hasBackground()) {
val rectHeight = targetRegion.height.toInt() - gap * 2
val rectWidth = getWidthInPixels(storage)
val config = GraphicsUtil.setupAAPainting(g)
GraphicsUtil.paintWithAlpha(g, BACKGROUND_ALPHA)
g.color = attrs.backgroundColor ?: textAttributes.backgroundColor
g.fillRoundRect(0, gap, rectWidth, rectHeight, ARC_WIDTH, ARC_HEIGHT)
g.fillRoundRect(rectWidth.margin, gap, rectWidth.boxWidth, rectHeight, ARC_WIDTH, ARC_HEIGHT)
config.restore()
}
}
g.withTranslated(LEFT_MARGIN + targetRegion.x, targetRegion.y) {
g.withTranslated(getWidthInPixels(storage).marginAndPadding + targetRegion.x, targetRegion.y) {
for (entry in entries) {
val hoveredWithCtrl = entry.isHoveredWithCtrl
val finalAttrs = if (hoveredWithCtrl) {
@@ -199,13 +207,16 @@ class InlayPresentationList(
attrs
}
g.withTranslated(xOffset, 0) {
entry.render(g, storage, finalAttrs, isDisabled, gap, targetRegion.height.toInt(), editor)
entry.render(g, metrics, finalAttrs, isDisabled, gap, targetRegion.height.toInt(), editor)
}
xOffset += entry.computeWidth(storage)
xOffset += entry.computeWidth(metrics)
}
}
}
private fun getMetrics(fontMetricsStorage: InlayTextMetricsStorage): InlayTextMetrics =
fontMetricsStorage.getFontMetrics(small = hintFormat.fontSize == HintFontSize.ABitSmallerThanInEditor)
@TestOnly
fun getEntries(): Array<InlayPresentationEntry> {
return entries
@@ -220,7 +231,7 @@ class InlayPresentationList(
return InlayData(
position,
tooltip,
hintColorKind,
hintFormat,
state,
providerId,
isDisabled,

View File

@@ -29,7 +29,7 @@ class InlayTreeSinkImpl(
override fun addPresentation(position: InlayPosition,
payloads: List<InlayPayload>?,
@NlsContexts.HintText tooltip: String?,
hintColorKind: HintColorKind,
hintFormat: HintFormat,
builder: PresentationTreeBuilder.() -> Unit) {
val b = PresentationTreeBuilderImpl.createRoot()
b.builder()
@@ -44,7 +44,7 @@ class InlayTreeSinkImpl(
else {
false
}
inlayDataToPresentation.add(InlayData(position, tooltip, hintColorKind, tree, providerId, disabled, payloads, providerClass, sourceId))
inlayDataToPresentation.add(InlayData(position, tooltip, hintFormat, tree, providerId, disabled, payloads, providerClass, sourceId))
}
override fun whenOptionEnabled(optionId: String, block: () -> Unit) {

View File

@@ -59,7 +59,7 @@ class DeclarativeHintsTogglingIntentionMenuContributor : IntentionMenuContributo
override fun addPresentation(position: InlayPosition,
payloads: List<InlayPayload>?,
tooltip: String?,
hintColorKind: HintColorKind,
hintFormat: HintFormat,
builder: PresentationTreeBuilder.() -> Unit) {
if (currentOptions.isEmpty()) {
attemptedToAddWithoutOptions = true

View File

@@ -21,7 +21,7 @@ class InlayTreeSinkTest : LightPlatformCodeInsightFixture4TestCase() {
val data = inlayData.single()
assertEquals(providerId, data.providerId)
assertEquals(false, data.disabled)
assertEquals(HintColorKind.TextWithoutBackground, data.hintColorKind)
assertEquals(HintColorKind.TextWithoutBackground, data.hintFormat.colorKind)
}
@Test

View File

@@ -1,10 +1,7 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.hints.declarative.impl
import com.intellij.codeInsight.hints.declarative.CollapseState
import com.intellij.codeInsight.hints.declarative.CollapsiblePresentationTreeBuilder
import com.intellij.codeInsight.hints.declarative.HintColorKind
import com.intellij.codeInsight.hints.declarative.PresentationTreeBuilder
import com.intellij.codeInsight.hints.declarative.*
import com.intellij.codeInsight.hints.declarative.impl.util.TinyTree
import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixture4TestCase
import junit.framework.TestCase
@@ -176,7 +173,7 @@ class MouseHandlingEntryTestCase : LightPlatformCodeInsightFixture4TestCase() {
val state = buildState {
initialStateBuilder()
}
val presentationList = InlayPresentationList(state, HintColorKind.Default, false, null, javaClass, null, DeclarativeInlayHintsPass.passSourceId)
val presentationList = InlayPresentationList(state, HintFormat.default, false, null, javaClass, null, DeclarativeInlayHintsPass.passSourceId)
val beforeClickEntries = presentationList.getEntries().toList()
assertEquals(beforeClickText, toText(beforeClickEntries))
var occurence = 0
@@ -194,7 +191,7 @@ class MouseHandlingEntryTestCase : LightPlatformCodeInsightFixture4TestCase() {
val newState = buildState {
updatedStateBuilder()
}
presentationList.updateState(newState, false, HintColorKind.TextWithoutBackground)
presentationList.updateState(newState, false, HintFormat.default.withColorKind(HintColorKind.TextWithoutBackground))
val updatedStateEntries = presentationList.getEntries().toList()
assertEquals(afterUpdateText, toText(updatedStateEntries))
}
@@ -252,7 +249,7 @@ class MouseHandlingEntryTestCase : LightPlatformCodeInsightFixture4TestCase() {
myFixture.configureByText("test.txt", "my text")
val root = PresentationTreeBuilderImpl.createRoot()
b(root)
val presentationList = InlayPresentationList(root.complete(), HintColorKind.Default, false, null, javaClass, null, DeclarativeInlayHintsPass.passSourceId)
val presentationList = InlayPresentationList(root.complete(), HintFormat.default, false, null, javaClass, null, DeclarativeInlayHintsPass.passSourceId)
val beforeClickEntries = presentationList.getEntries().toList()
TestCase.assertEquals(beforeClick, toText(beforeClickEntries))
beforeClickEntries.find { (it as TextInlayPresentationEntry).text == click }!!.handleClick(myFixture.editor, presentationList,

View File

@@ -39,7 +39,7 @@ class GroovyLambdaParameterTypeHintsInlayProvider : InlayHintsProvider {
sink: InlayTreeSink,
suffixText: String) {
val type = getRepresentableType(parameter) ?: return
sink.addPresentation(InlineInlayPosition(offset, relatedToPrevious = true), null, null, HintColorKind.Default) {
sink.addPresentation(InlineInlayPosition(offset, relatedToPrevious = true), null, null, HintFormat.default) {
JavaTypeHintsFactory.typeHint(type, this)
text(suffixText)
}

View File

@@ -2,6 +2,7 @@
package org.jetbrains.kotlin.idea.k2.codeinsight.hints
import com.intellij.codeInsight.hints.declarative.HintColorKind
import com.intellij.codeInsight.hints.declarative.HintFormat
import com.intellij.codeInsight.hints.declarative.InlayTreeSink
import com.intellij.codeInsight.hints.declarative.InlineInlayPosition
import com.intellij.psi.PsiElement
@@ -62,7 +63,7 @@ class KtCallChainHintsProvider : AbstractKtInlayHintsProvider() {
for ((expression, type) in reversedChain) {
sink.addPresentation(
InlineInlayPosition(expression.textRange.endOffset, relatedToPrevious = true),
hintColorKind = HintColorKind.Default,
hintFormat = HintFormat.default,
) {
printKtType(type)
}

View File

@@ -1,12 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.k2.codeinsight.hints
import com.intellij.codeInsight.hints.declarative.HintColorKind
import com.intellij.codeInsight.hints.declarative.InlayActionData
import com.intellij.codeInsight.hints.declarative.InlayTreeSink
import com.intellij.codeInsight.hints.declarative.InlineInlayPosition
import com.intellij.codeInsight.hints.declarative.PsiPointerInlayActionNavigationHandler
import com.intellij.codeInsight.hints.declarative.PsiPointerInlayActionPayload
import com.intellij.codeInsight.hints.declarative.*
import com.intellij.psi.PsiElement
import com.intellij.psi.createSmartPointer
import org.jetbrains.kotlin.analysis.api.analyze
@@ -51,7 +46,7 @@ class KtLambdasHintsProvider : AbstractKtInlayHintsProvider() {
}
if (!isUsedAsExpression) return@whenOptionEnabled
sink.addPresentation(InlineInlayPosition(expression.endOffset, true), hintColorKind = HintColorKind.Default) {
sink.addPresentation(InlineInlayPosition(expression.endOffset, true), hintFormat = HintFormat.default) {
text("^")
text(lambdaName,
lambdaExpression.createSmartPointer().let {
@@ -96,7 +91,7 @@ class KtLambdasHintsProvider : AbstractKtInlayHintsProvider() {
analyze(functionLiteral) {
val anonymousFunctionSymbol = functionLiteral.symbol
anonymousFunctionSymbol.receiverParameter?.let { receiverSymbol ->
sink.addPresentation(InlineInlayPosition(lbrace.textRange.endOffset, true), hintColorKind = HintColorKind.Default) {
sink.addPresentation(InlineInlayPosition(lbrace.textRange.endOffset, true), hintFormat = HintFormat.default) {
text("this: ")
printKtType(receiverSymbol.type)
}
@@ -105,7 +100,7 @@ class KtLambdasHintsProvider : AbstractKtInlayHintsProvider() {
anonymousFunctionSymbol.valueParameters.singleOrNull()?.let { singleParameterSymbol ->
val type = singleParameterSymbol.takeIf { it.isImplicitLambdaParameter }
?.returnType?.takeUnless { it.isUnitType } ?: return@let
sink.addPresentation(InlineInlayPosition(lbrace.textRange.endOffset, true), hintColorKind = HintColorKind.Default) {
sink.addPresentation(InlineInlayPosition(lbrace.textRange.endOffset, true), hintFormat = HintFormat.default) {
text("it: ")
printKtType(type)
}

View File

@@ -1,12 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.k2.codeinsight.hints
import com.intellij.codeInsight.hints.declarative.HintColorKind
import com.intellij.codeInsight.hints.declarative.InlayActionData
import com.intellij.codeInsight.hints.declarative.InlayTreeSink
import com.intellij.codeInsight.hints.declarative.InlineInlayPosition
import com.intellij.codeInsight.hints.declarative.PsiPointerInlayActionNavigationHandler
import com.intellij.codeInsight.hints.declarative.PsiPointerInlayActionPayload
import com.intellij.codeInsight.hints.declarative.*
import com.intellij.codeInsight.hints.filtering.Matcher
import com.intellij.codeInsight.hints.filtering.MatcherConstructor
import com.intellij.psi.PsiComment
@@ -126,7 +121,7 @@ class KtParameterHintsProvider : AbstractKtInlayHintsProvider() {
if (argument.isArgumentNamed(symbol)) continue
name.takeUnless(Name::isSpecial)?.asString()?.let { stringName ->
sink.addPresentation(InlineInlayPosition(argument.startOffset, true), hintColorKind = HintColorKind.Default) {
sink.addPresentation(InlineInlayPosition(argument.startOffset, true), hintFormat = HintFormat.default) {
if (symbol.isVararg) text(Typography.ellipsis.toString())
text(stringName,
symbol.psi?.createSmartPointer()?.let {

View File

@@ -1,7 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.k2.codeinsight.hints
import com.intellij.codeInsight.hints.declarative.HintColorKind
import com.intellij.codeInsight.hints.declarative.HintFormat
import com.intellij.codeInsight.hints.declarative.InlayTreeSink
import com.intellij.codeInsight.hints.declarative.InlineInlayPosition
import com.intellij.openapi.util.registry.Registry
@@ -258,7 +258,7 @@ internal fun collectProvideTypeHint(element: KtCallableDeclaration, offset: Int,
}
}
sink.addPresentation(InlineInlayPosition(offset, true), hintColorKind = HintColorKind.Default) {
sink.addPresentation(InlineInlayPosition(offset, true), hintFormat = HintFormat.default) {
text(prefix)
printKtType(ktType)
}
@@ -351,7 +351,7 @@ internal fun collectLambdaTypeHint(lambdaExpression: KtExpression, sink: InlayTr
analyze(lambdaExpression) {
val functionCall = functionLiteral.resolveToCall()?.singleFunctionCallOrNull() ?: return
sink.addPresentation(InlineInlayPosition(lambdaExpression.endOffset, true), hintColorKind = HintColorKind.Default) {
sink.addPresentation(InlineInlayPosition(lambdaExpression.endOffset, true), hintFormat = HintFormat.default) {
text(": ")
printKtType(functionCall.symbol.returnType)
}

View File

@@ -1,7 +1,7 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.k2.codeinsight.hints
import com.intellij.codeInsight.hints.declarative.HintColorKind
import com.intellij.codeInsight.hints.declarative.HintFormat
import com.intellij.codeInsight.hints.declarative.InlayTreeSink
import com.intellij.codeInsight.hints.declarative.InlineInlayPosition
import com.intellij.psi.PsiElement
@@ -39,11 +39,11 @@ class KtValuesHintsProvider : AbstractKtInlayHintsProvider() {
}
if (!applicable) return
sink.addPresentation(InlineInlayPosition(leftExp.endOffset, true), hintColorKind = HintColorKind.Default) {
sink.addPresentation(InlineInlayPosition(leftExp.endOffset, true), hintFormat = HintFormat.default) {
text(leftText)
}
rightText?.let {
sink.addPresentation(InlineInlayPosition(rightExp.startOffset, true), hintColorKind = HintColorKind.Default) {
sink.addPresentation(InlineInlayPosition(rightExp.startOffset, true), hintFormat = HintFormat.default) {
text(it)
}
}