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);
}
}