package jetbrains.mps.debug.api; /*Generated by MPS */ import com.intellij.openapi.components.ApplicationComponent; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import java.util.Map; import jetbrains.mps.internal.collections.runtime.MapSequence; import java.util.LinkedHashMap; import java.util.Set; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.LinkedHashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.debug.api.breakpoints.ILocationBreakpoint; import org.jetbrains.mps.openapi.language.SAbstractConcept; import com.intellij.openapi.project.Project; import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; import org.apache.log4j.Level; import jetbrains.mps.textgen.trace.TraceablePositionInfo; import jetbrains.mps.textgen.trace.TraceInfo; import com.intellij.openapi.application.ApplicationManager; public class BreakpointCreatorsManager implements ApplicationComponent { private static final Logger LOG = LogManager.getLogger(BreakpointCreatorsManager.class); @Deprecated private Map<String, BreakpointCreator> myCreatorsByConcept = MapSequence.fromMap(new LinkedHashMap<String, BreakpointCreator>(16, (float) 0.75, false)); private Set<BreakpointCreator> myCreators = SetSequence.fromSet(new LinkedHashSet<BreakpointCreator>()); public BreakpointCreatorsManager() { } @NotNull @Override public String getComponentName() { return "Debug Info Manager"; } public void addCreator(BreakpointCreator creator) { SetSequence.fromSet(myCreators).addElement(creator); } public void removeCreator(BreakpointCreator creator) { SetSequence.fromSet(myCreators).removeElement(creator); } public boolean isDebuggableNode(@Nullable final SNode node) { if (node == null) { return false; } return SetSequence.fromSet(myCreators).findFirst(new IWhereFilter<BreakpointCreator>() { public boolean accept(BreakpointCreator it) { return it._0().invoke(SNodeOperations.getConcept(node), node); } }) != null; } private ILocationBreakpoint createBreakpoint(SAbstractConcept concept, SNode node, Project project) { for (BreakpointCreator creator : SetSequence.fromSet(myCreators)) { if (creator._0().invoke(concept, node)) { _FunctionTypes._return_P2_E0<? extends ILocationBreakpoint, ? super SNode, ? super Project> function = creator._1(); if (function == null) { if (LOG.isEnabledFor(Level.WARN)) { LOG.warn("Could not create breakpoint for node " + node); } return null; } return function.invoke(node, project); } } return null; } @Nullable public ILocationBreakpoint createBreakpoint(SNode node, Project project) { ILocationBreakpoint breakpoint = createBreakpoint(SNodeOperations.getConcept(node), node, project); if (breakpoint != null) { return breakpoint; } // [MM] why are we changing concept, but not node? TraceablePositionInfo position = TraceInfo.getPositionForNode(node); if (position != null) { SAbstractConcept concept = position.getConcept(); if (concept == null) { return null; } return createBreakpoint(concept, node, project); } return null; } @Override public void initComponent() { } @Override public void disposeComponent() { } public static BreakpointCreatorsManager getInstance() { return ApplicationManager.getApplication().getComponent(BreakpointCreatorsManager.class); } }