package jetbrains.mps.debug.api.source; /*Generated by MPS */ import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.project.Project; import jetbrains.mps.project.MPSProject; import java.util.Map; import java.util.List; import jetbrains.mps.internal.collections.runtime.MapSequence; import java.util.LinkedHashMap; import org.jetbrains.annotations.Nullable; import jetbrains.mps.debug.api.programState.ILocation; import org.jetbrains.annotations.NotNull; import jetbrains.mps.debug.api.AbstractDebugSession; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import org.jetbrains.annotations.NonNls; import java.util.ArrayList; import jetbrains.mps.internal.collections.runtime.Sequence; public class PositionProvider implements ProjectComponent { private final Project myIdeaProject; private final MPSProject myProject; private final Map<String, List<IPositionProvider>> myKeysToProviders = MapSequence.fromMap(new LinkedHashMap<String, List<IPositionProvider>>(16, (float) 0.75, false)); public PositionProvider(Project project, MPSProject mpsProject) { myIdeaProject = project; myProject = mpsProject; } @Nullable public SourcePosition getPosition(@Nullable ILocation location, @NotNull final AbstractDebugSession session) { for (String key : MapSequence.fromMap(myKeysToProviders).keySet()) { IPositionProvider provider = ListSequence.fromList(MapSequence.fromMap(myKeysToProviders).get(key)).findFirst(new IWhereFilter<IPositionProvider>() { public boolean accept(IPositionProvider it) { return it.accepts(session); } }); if (provider != null) { SourcePosition position = provider.getPosition(location, session); if (position != null) { return position; } } } return null; } public void addProvider(@NotNull IPositionProvider provider, @NonNls String key) { List<IPositionProvider> providersForKey = MapSequence.fromMap(myKeysToProviders).get(key); if (providersForKey == null) { providersForKey = ListSequence.fromList(new ArrayList<IPositionProvider>()); MapSequence.fromMap(myKeysToProviders).put(key, providersForKey); } ListSequence.fromList(providersForKey).insertElement(0, provider); } public boolean removeProvider(@NotNull IPositionProvider provider) { for (List<IPositionProvider> providerList : Sequence.fromIterable(MapSequence.fromMap(myKeysToProviders).values())) { if (ListSequence.fromList(providerList).removeElement(provider) != null) { return true; } } return false; } @Override public void projectOpened() { } @Override public void projectClosed() { } @Override public void initComponent() { addProvider(new NodePositionProvider(myProject), NodeSourcePosition.class.getName()); addProvider(new TextPositionProvider(myIdeaProject), TextSourcePosition.class.getName()); } @Override public void disposeComponent() { MapSequence.fromMap(myKeysToProviders).clear(); } @NonNls @NotNull @Override public String getComponentName() { return "Position Provider"; } public static PositionProvider getInstance(Project project) { return project.getComponent(PositionProvider.class); } }