/*
* Copyright 2003-2011 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.newTypesystem.state.blocks;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.AttributeOperations;
import jetbrains.mps.lang.typesystem.runtime.HUtil;
import jetbrains.mps.newTypesystem.TypesUtil;
import jetbrains.mps.newTypesystem.state.State;
import jetbrains.mps.typesystemEngine.util.LatticeUtil;
import org.jetbrains.mps.openapi.model.SNode;
import java.util.*;
public enum ConditionKind {
ANY {
@Override
public List<SNode> getUnresolvedInputs(SNode node, State state) {
return Collections.EMPTY_LIST;
}
@Override
public String getPresentation() {
return "";
}
},
SHALLOW {
@Override
public List<SNode> getUnresolvedInputs(SNode node, State state) {
if (node != null) {
SNode representative = state.getRepresentative(node);
if (HUtil.isRuntimeTypeVariable(representative)) {
return Arrays.asList(representative);
}
else if (LatticeUtil.isMeet(representative)) {
List<SNode> result = new ArrayList<SNode>();
for (SNode arg : LatticeUtil.getMeetArguments(representative)) {
final SNode argRpt = state.getRepresentative(arg);
if (HUtil.isRuntimeTypeVariable(argRpt)) {
result.add(argRpt);
}
}
return result;
}
else if (LatticeUtil.isJoin(representative)) {
List<SNode> result = new ArrayList<SNode>();
for (SNode arg : LatticeUtil.getJoinArguments(representative)) {
final SNode argRpt = state.getRepresentative(arg);
if (HUtil.isRuntimeTypeVariable(argRpt)) {
result.add(argRpt);
}
}
return result;
}
}
return Collections.EMPTY_LIST;
}
@Override
public String getPresentation() {
return "shallow";
}
},
CONCRETE {
@Override
public List<SNode> getUnresolvedInputs(SNode node, State state) {
SNode representative = state.getRepresentative(node);
if (node == null || representative == null) {
return new LinkedList<SNode>();
}
if (HUtil.isRuntimeTypeVariable(representative)) {
return Arrays.asList(representative);
}
List<SNode> result = new ArrayList<SNode>();
for (SNode referent : TypesUtil.getNodeReferents(representative)) {
if (referent != null) {
SNode refRepresentative = state.getRepresentative(referent);
if (HUtil.isRuntimeTypeVariable(refRepresentative)) {
result.add(refRepresentative);
}
}
}
if (TypesUtil.getVariables(node, state).contains(node)) {
return result;
}
for (SNode child : representative.getChildren()) {
if (AttributeOperations.isAttribute(child)) continue;
result.addAll(getUnresolvedInputs(child, state));
}
return result;
}
@Override
public String getPresentation() {
return "deep";
}
};
public abstract List<SNode> getUnresolvedInputs(SNode node, State state);
public abstract String getPresentation();
}