From 58de6c223ef9f095c92ce59a31ae2c3b287d95c6 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Tue, 26 Jan 2016 15:35:54 +0300 Subject: [PATCH] IDEA-150675 Lambda objects are rendered in an incomprehensive way --- .../debugger/engine/DefaultSyntheticProvider.java | 7 +++---- .../src/com/intellij/debugger/impl/DebuggerUtilsEx.java | 9 +++++++++ .../intellij/debugger/ui/tree/render/ClassRenderer.java | 8 +++++++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DefaultSyntheticProvider.java b/java/debugger/impl/src/com/intellij/debugger/engine/DefaultSyntheticProvider.java index 772e997da668..fd162f12a07c 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DefaultSyntheticProvider.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DefaultSyntheticProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-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. @@ -15,7 +15,7 @@ */ package com.intellij.debugger.engine; -import com.sun.jdi.ReferenceType; +import com.intellij.debugger.impl.DebuggerUtilsEx; import com.sun.jdi.TypeComponent; import com.sun.jdi.VirtualMachine; @@ -30,8 +30,7 @@ public class DefaultSyntheticProvider implements SyntheticTypeComponentProvider return false; } else { - ReferenceType type = typeComponent.declaringType(); - if (type.name().contains("$$Lambda$")) { + if (DebuggerUtilsEx.isLambdaClassName(typeComponent.declaringType().name())) { return true; } } diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java index 8897fa26558e..0f062bf231cf 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java @@ -808,6 +808,15 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils { return null; } + public static boolean isLambdaClassName(String typeName) { + return getLambdaBaseClassName(typeName) != null; + } + + @Nullable + public static String getLambdaBaseClassName(String typeName) { + return StringUtil.substringBefore(typeName, "$$Lambda$"); + } + public static List collectLambdas(@NotNull SourcePosition position, final boolean onlyOnTheLine) { ApplicationManager.getApplication().assertReadAccessAllowed(); PsiFile file = position.getFile(); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java index b145bfb3a582..7453c6f5ae6b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-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. @@ -22,6 +22,7 @@ import com.intellij.debugger.engine.DebuggerUtils; import com.intellij.debugger.engine.evaluation.EvaluateException; import com.intellij.debugger.engine.evaluation.EvaluationContext; import com.intellij.debugger.engine.jdi.StackFrameProxy; +import com.intellij.debugger.impl.DebuggerUtilsEx; import com.intellij.debugger.ui.impl.watch.FieldDescriptorImpl; import com.intellij.debugger.ui.impl.watch.MessageDescriptor; import com.intellij.debugger.ui.impl.watch.NodeManagerImpl; @@ -80,6 +81,11 @@ public class ClassRenderer extends NodeRendererImpl{ if (SHOW_FQ_TYPE_NAMES) { return typeName; } + String baseLambdaClassName = DebuggerUtilsEx.getLambdaBaseClassName(typeName); + if (baseLambdaClassName != null) { + return renderTypeName(baseLambdaClassName) + "$lambda"; + } + final int dotIndex = typeName.lastIndexOf('.'); if (dotIndex > 0) { return typeName.substring(dotIndex + 1);