/*
* Copyright 2003-2015 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.typesystem.inference;
import jetbrains.mps.errors.QuickFixProvider;
import jetbrains.mps.util.Pair;
import org.jetbrains.mps.openapi.model.SNode;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class EquationInfo {
private String myErrorString;
private SNode myNodeWithError;
private String myRuleModel;
private String myRuleId;
private Stack<Pair<String, String>> myOuterRulesIds = null;
private List<QuickFixProvider> myIntentionProviders;
private int myInequationPriority;
private boolean myIsStrong = false;
public EquationInfo(SNode nodeWithError, String errorString) {
myErrorString = errorString;
myNodeWithError = nodeWithError;
}
public EquationInfo(SNode nodeWithError, String errorString, String ruleModel, String ruleId, int inequationPriority, QuickFixProvider intentionProvider) {
myErrorString = errorString;
myNodeWithError = nodeWithError;
myRuleModel = ruleModel;
myRuleId = ruleId;
myInequationPriority = inequationPriority;
addIntentionProvider(intentionProvider);
}
@Deprecated
public EquationInfo(SNode nodeWithError, String errorString, String ruleModel, String ruleId, int inequationPriority) {
this(nodeWithError, errorString, ruleModel, ruleId, inequationPriority, null);
}
public EquationInfo(SNode nodeWithError, String errorString, String ruleModel, String ruleId) {
myErrorString = errorString;
myNodeWithError = nodeWithError;
myRuleModel = ruleModel;
myRuleId = ruleId;
}
public EquationInfo(EquationInfo pattern) {
myErrorString = pattern.myErrorString;
myNodeWithError = pattern.myNodeWithError;
myRuleModel = pattern.myRuleModel;
myRuleId = pattern.myRuleId;
myInequationPriority = pattern.myInequationPriority;
if (pattern.myIntentionProviders != null) {
if (myIntentionProviders == null) {
myIntentionProviders = new ArrayList<QuickFixProvider>(pattern.myIntentionProviders);
}
myIntentionProviders.addAll(pattern.myIntentionProviders);
}
}
public String getErrorString() {
return myErrorString;
}
public SNode getNodeWithError() {
return myNodeWithError;
}
public String getRuleModel() {
return myRuleModel;
}
public String getRuleId() {
return myRuleId;
}
public void setIntentionProvider(QuickFixProvider intentionProvider) {
addIntentionProvider(intentionProvider);
}
public void addIntentionProvider(QuickFixProvider intentionProvider) {
if (myIntentionProviders == null) {
myIntentionProviders = new ArrayList<QuickFixProvider>(1);
}
myIntentionProviders.add(intentionProvider);
}
public List<QuickFixProvider> getIntentionProviders() {
ArrayList<QuickFixProvider> result = new ArrayList<QuickFixProvider>(1);
if (myIntentionProviders != null) {
result.addAll(myIntentionProviders);
}
return result;
}
public void pushOuterRuleId(String modelId, String ruleId) {
if (myOuterRulesIds == null) {
myOuterRulesIds = new Stack<Pair<String, String>>();
}
myOuterRulesIds.push(new Pair<String, String>(modelId, ruleId));
}
public void getOuterRulesIdFromInfo(EquationInfo outerInfo) {
if (myOuterRulesIds == null) {
myOuterRulesIds = new Stack<Pair<String, String>>();
}
for (Pair<String, String> id : outerInfo.getAdditionalRulesIds()) {
myOuterRulesIds.push(id);
}
myOuterRulesIds.push(new Pair<String, String>(outerInfo.getRuleModel(), outerInfo.getRuleId()));
}
public List<Pair<String, String>> getAdditionalRulesIds() {
if (myOuterRulesIds == null) return new ArrayList<Pair<String, String>>();
return new ArrayList<Pair<String, String>>(myOuterRulesIds);
}
boolean isStrong() {
return myIsStrong;
}
void setStrong() {
myIsStrong = true;
}
}