/*
* Copyright 2003-2016 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 jetbrains.mps.textgen.trace;
import org.apache.log4j.LogManager;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.model.SNode;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.SortedMap;
import java.util.TreeMap;
public class ScopePositionInfo extends PositionInfo {
private final SortedMap<String, VarInfo> myNamesToVars = new TreeMap<String, VarInfo>();
private final Map<SNode, VarInfo> myTempNodeToVarMap = new HashMap<SNode, VarInfo>();
public ScopePositionInfo() {
}
@Nls
public String getVarId(String varName) {
return check_azb46d_a0a6(myNamesToVars.get(varName));
}
public Collection<String> getVarNames() {
String[] names = myNamesToVars.keySet().toArray(new String[0]);
Arrays.sort(names);
return Arrays.asList(names);
}
public void addVarInfo(@NotNull VarInfo varInfo) {
myNamesToVars.put(varInfo.getVarName(), varInfo);
}
public void addVarInfo(@NotNull SNode node) {
String varName = node.getName();
if (varName != null) {
VarInfo varInfo = new VarInfo();
varInfo.setVarName(varName);
myTempNodeToVarMap.put(node, varInfo);
myNamesToVars.put(varInfo.getVarName(), varInfo);
} else {
LogManager.getLogger(ScopePositionInfo.class).warn("variable name is null for node " + node.getNodeId().toString());
}
}
public Map<SNode, VarInfo> getTempVarInfoMap() {
return myTempNodeToVarMap;
}
public void clearTempVarInfoMap() {
myTempNodeToVarMap.clear();
}
public void removeVarInfo(VarInfo varInfo) {
myNamesToVars.remove(varInfo.getVarName());
}
@Override
public int compareTo(PositionInfo p) {
int result = super.compareTo(p);
if (result != 0) {
return result;
}
if (myNamesToVars.size() == ((ScopePositionInfo) p).myNamesToVars.size()) {
Iterator<Entry<String, VarInfo>> vars = myNamesToVars.entrySet().iterator();
Iterator<Entry<String, VarInfo>> theirvars = (((ScopePositionInfo) p).myNamesToVars).entrySet().iterator();
while (vars.hasNext()) {
Entry<String, VarInfo> first = vars.next();
Entry<String, VarInfo> theirfirst = theirvars.next();
int compare = compare(first, theirfirst);
if (compare != 0) {
return compare;
}
}
return 0;
}
return myNamesToVars.size() - (((ScopePositionInfo) p).myNamesToVars).size();
}
public int compare(Entry<String, VarInfo> mapping1, Entry<String, VarInfo> mapping2) {
if (mapping1.getKey() == null) {
if (mapping2.getKey() != null) {
return 1;
}
} else {
if (mapping2.getKey() == null) {
return -1;
}
int compareTo = mapping1.getKey().compareTo(mapping2.getKey());
if (compareTo != 0) {
return compareTo;
}
}
String id1 = mapping1.getValue().getNodeId();
String id2 = mapping2.getValue().getNodeId();
if (id1 == null) {
if (id2 == null) {
return 0;
}
return -1;
}
if (id2 == null) {
return 1;
}
return id1.compareTo(id2);
}
private static String check_azb46d_a0a6(VarInfo checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.getNodeId();
}
return null;
}
}