package org.jetbrains.plugins.ruby.motion.run.renderers; import com.intellij.execution.ExecutionException; import com.jetbrains.cidr.execution.debugger.backend.DebuggerCommandException; import com.jetbrains.cidr.execution.debugger.backend.LLValueData; import com.jetbrains.cidr.execution.debugger.evaluation.EvaluationContext; import com.jetbrains.cidr.execution.debugger.evaluation.ValueRendererFactory; import com.jetbrains.cidr.execution.debugger.evaluation.renderers.NSCollectionValueRenderer; import com.jetbrains.cidr.execution.debugger.evaluation.renderers.ValueRenderer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * @author Dennis.Ushakov */ public class MotionValueRendererFactory implements ValueRendererFactory { @Nullable @Override public ValueRenderer createRenderer(@NotNull FactoryContext context) throws ExecutionException, DebuggerCommandException { try { LLValueData data = context.getLLValueData(); if (data.isValidPointer()) { context.getEvaluationContext().evaluate(EvaluationContext.cast("rb_inspect(" + EvaluationContext.cast(data.getPointer(), "id") + ")", "id")); // we want ObjC renderers for our collections // Ruby collections are inheriting from native ones and don't have any useful instance variables final ValueRenderer collectionRenderer = new NSCollectionValueRenderer.Factory().createRenderer(context); return collectionRenderer != null ? collectionRenderer : new MotionObjectRenderer(context.getPhysicalValue()); } } catch (DebuggerCommandException ignored) {} return null; } }