From a449fe1158f6c35cd7e253be3d650c8fe860a846 Mon Sep 17 00:00:00 2001 From: Nikolay Tropin Date: Mon, 1 Dec 2014 19:32:40 +0300 Subject: [PATCH] extra frame variables provider --- .../engine/DefaultSyntheticProvider.java | 31 +++++++++++++++++++ .../debugger/engine/JavaStackFrame.java | 3 +- .../debugger/engine/PositionManagerImpl.java | 3 +- .../intellij/debugger/engine/RequestHint.java | 4 +-- .../debugger/ui/impl/watch/DebuggerTree.java | 7 ++--- .../debugger/engine/DebuggerUtils.java | 6 ++-- .../SyntheticTypeComponentProvider.java | 29 +++++++++++++++++ resources/src/META-INF/IdeaPlugin.xml | 4 +++ 8 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 java/debugger/impl/src/com/intellij/debugger/engine/DefaultSyntheticProvider.java create mode 100644 java/debugger/openapi/src/com/intellij/debugger/engine/SyntheticTypeComponentProvider.java diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DefaultSyntheticProvider.java b/java/debugger/impl/src/com/intellij/debugger/engine/DefaultSyntheticProvider.java new file mode 100644 index 000000000000..4eb4ef57ba32 --- /dev/null +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DefaultSyntheticProvider.java @@ -0,0 +1,31 @@ +/* + * Copyright 2000-2014 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 com.intellij.debugger.engine; + +import com.sun.jdi.TypeComponent; +import com.sun.jdi.VirtualMachine; + +/** + * Nikolay.Tropin + * 2014-11-27 + */ +public class DefaultSyntheticProvider implements SyntheticTypeComponentProvider { + @Override + public boolean isSynthetic(TypeComponent typeComponent) { + VirtualMachine machine = typeComponent.virtualMachine(); + return machine != null && machine.canGetSyntheticAttribute() && typeComponent.isSynthetic(); + } +} diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java index 1f2e2fb97b70..9e45f332df1b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaStackFrame.java @@ -216,9 +216,8 @@ public class JavaStackFrame extends XStackFrame { final ReferenceType thisRefType = thisObjectReference.referenceType(); if (thisRefType instanceof ClassType && thisRefType.equals(location.declaringType()) && thisRefType.name().contains("$")) { // makes sense for nested classes only final ClassType clsType = (ClassType)thisRefType; - final VirtualMachineProxyImpl vm = debugProcess.getVirtualMachineProxy(); for (Field field : clsType.fields()) { - if ((!vm.canGetSyntheticAttribute() || field.isSynthetic()) && StringUtil + if (!DebuggerUtils.isSynthetic(field) && StringUtil .startsWith(field.name(), FieldDescriptorImpl.OUTER_LOCAL_VAR_FIELD_PREFIX)) { final FieldDescriptorImpl fieldDescriptor = myNodeManager.getFieldDescriptor(myDescriptor, thisObjectReference, field); children.add(JavaValue.create(fieldDescriptor, evaluationContext, myNodeManager)); diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java index afee28f76498..fa3260dae392 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/PositionManagerImpl.java @@ -353,7 +353,6 @@ public class PositionManagerImpl implements PositionManager { return null; } - final boolean canGetSynthetic = vmProxy.canGetSyntheticAttribute(); int rangeBegin = Integer.MAX_VALUE; int rangeEnd = Integer.MIN_VALUE; for (Location location : fromClass.allLineLocations()) { @@ -365,7 +364,7 @@ public class PositionManagerImpl implements PositionManager { continue; } final Method method = location.method(); - if (method == null || (canGetSynthetic && method.isSynthetic()) || method.isBridge()) { + if (method == null || DebuggerUtils.isSynthetic(method) || method.isBridge()) { // do not take into account synthetic stuff continue; } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/RequestHint.java b/java/debugger/impl/src/com/intellij/debugger/engine/RequestHint.java index 9be08b960e51..906e409539d0 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/RequestHint.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/RequestHint.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -210,7 +210,7 @@ public class RequestHint { if (location != null) { final Method method = location.method(); if (method != null) { - if (myVirtualMachineProxy.canGetSyntheticAttribute() ? method.isSynthetic() : method.name().indexOf('$') >= 0) { + if (myVirtualMachineProxy.canGetSyntheticAttribute() ? DebuggerUtils.isSynthetic(method) : method.name().indexOf('$') >= 0) { // step into lambda methods if (!method.name().startsWith(LambdaMethodFilter.LAMBDA_METHOD_PREFIX)) { return myDepth; diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java index d333eaaacd10..637a3985ed90 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -23,6 +23,7 @@ package com.intellij.debugger.ui.impl.watch; import com.intellij.debugger.DebuggerBundle; import com.intellij.debugger.DebuggerInvocationUtil; import com.intellij.debugger.engine.DebugProcessImpl; +import com.intellij.debugger.engine.DebuggerUtils; import com.intellij.debugger.engine.SuspendContextImpl; import com.intellij.debugger.engine.evaluation.EvaluateException; import com.intellij.debugger.engine.evaluation.EvaluationContextImpl; @@ -472,10 +473,8 @@ public abstract class DebuggerTree extends DebuggerTreeBase implements DataProvi final ReferenceType thisRefType = thisObjectReference.referenceType(); if (thisRefType instanceof ClassType && thisRefType.equals(location.declaringType()) && thisRefType.name().contains("$")) { // makes sense for nested classes only final ClassType clsType = (ClassType)thisRefType; - final DebugProcessImpl debugProcess = getDebuggerContext().getDebugProcess(); - final VirtualMachineProxyImpl vm = debugProcess.getVirtualMachineProxy(); for (Field field : clsType.fields()) { - if ((!vm.canGetSyntheticAttribute() || field.isSynthetic()) && StringUtil.startsWith(field.name(), FieldDescriptorImpl.OUTER_LOCAL_VAR_FIELD_PREFIX)) { + if ((!DebuggerUtils.isSynthetic(field)) && StringUtil.startsWith(field.name(), FieldDescriptorImpl.OUTER_LOCAL_VAR_FIELD_PREFIX)) { final FieldDescriptorImpl fieldDescriptor = myNodeManager.getFieldDescriptor(stackDescriptor, thisObjectReference, field); myChildren.add(myNodeManager.createNode(fieldDescriptor, evaluationContext)); } diff --git a/java/debugger/openapi/src/com/intellij/debugger/engine/DebuggerUtils.java b/java/debugger/openapi/src/com/intellij/debugger/engine/DebuggerUtils.java index 38f04a97f66f..f91c5e2a185a 100644 --- a/java/debugger/openapi/src/com/intellij/debugger/engine/DebuggerUtils.java +++ b/java/debugger/openapi/src/com/intellij/debugger/engine/DebuggerUtils.java @@ -485,8 +485,10 @@ public abstract class DebuggerUtils { if (typeComponent == null) { return false; } - VirtualMachine machine = typeComponent.virtualMachine(); - return machine != null && machine.canGetSyntheticAttribute() && typeComponent.isSynthetic(); + for (SyntheticTypeComponentProvider provider : SyntheticTypeComponentProvider.EP_NAME.getExtensions()) { + if (provider.isSynthetic(typeComponent)) return true; + } + return false; } public static boolean isSimpleGetter(PsiMethod method) { diff --git a/java/debugger/openapi/src/com/intellij/debugger/engine/SyntheticTypeComponentProvider.java b/java/debugger/openapi/src/com/intellij/debugger/engine/SyntheticTypeComponentProvider.java new file mode 100644 index 000000000000..5f24bfbbbecd --- /dev/null +++ b/java/debugger/openapi/src/com/intellij/debugger/engine/SyntheticTypeComponentProvider.java @@ -0,0 +1,29 @@ +/* + * Copyright 2000-2014 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 com.intellij.debugger.engine; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.sun.jdi.TypeComponent; + +/** + * Nikolay.Tropin + * 2014-11-27 + */ +public interface SyntheticTypeComponentProvider { + ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.debugger.syntheticProvider"); + + boolean isSynthetic(TypeComponent typeComponent); +} diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 2f2d1b08ea36..e749654f1da8 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -118,6 +118,9 @@ + + @@ -1459,6 +1462,7 @@ +