package jetbrains.mps.lang.dataFlow.analyzers.typesystem;
/*Generated by MPS */
import jetbrains.mps.lang.typesystem.runtime.AbstractNonTypesystemRule_Runtime;
import jetbrains.mps.lang.typesystem.runtime.NonTypesystemRule_Runtime;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.typesystem.inference.TypeCheckingContext;
import jetbrains.mps.lang.typesystem.runtime.IsApplicableStatus;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.Language;
import java.util.Set;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import jetbrains.mps.errors.messageTargets.MessageTarget;
import jetbrains.mps.errors.messageTargets.NodeMessageTarget;
import jetbrains.mps.errors.messageTargets.PropertyMessageTarget;
import jetbrains.mps.errors.IErrorReporter;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.errors.BaseQuickFixProvider;
import org.jetbrains.mps.openapi.language.SAbstractConcept;
import org.jetbrains.mps.openapi.model.SModel;
public class check_ExtendedAnalyzersAreInExtendedLanguages_NonTypesystemRule extends AbstractNonTypesystemRule_Runtime implements NonTypesystemRule_Runtime {
public check_ExtendedAnalyzersAreInExtendedLanguages_NonTypesystemRule() {
}
public void applyRule(final SNode rule, final TypeCheckingContext typeCheckingContext, IsApplicableStatus status) {
SModule module = check_b4f08s_a0a0b(SNodeOperations.getModel(rule));
if (!(module instanceof Language)) {
return;
}
Language ruleLanguage = ((Language) module);
Set<Language> extendedLanguages = ruleLanguage.getAllExtendedLanguages();
SNode analyzer = SLinkOperations.getTarget(rule, MetaAdapterFactory.getReferenceLink(0x97a52717898f4598L, 0x8150573d9fd03868L, 0x5faaa6bbd57b6c8L, 0x3952cf7bd76e6440L, "analyzer"));
if (analyzer == null) {
return;
}
SModule analyzerModule = check_b4f08s_a0g0b(SNodeOperations.getModel(analyzer));
if (!(analyzerModule instanceof Language)) {
return;
}
Language analyzerLanguage = ((Language) analyzerModule);
if (analyzerLanguage != ruleLanguage && !(SetSequence.fromSet(extendedLanguages).contains(analyzerLanguage))) {
{
MessageTarget errorTarget = new NodeMessageTarget();
errorTarget = new PropertyMessageTarget("name");
IErrorReporter _reporter_2309309498 = typeCheckingContext.reportTypeError(rule, "language " + analyzerLanguage.getModuleName() + " of analyzer " + SPropertyOperations.getString(analyzer, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")) + " is not extended by " + ruleLanguage.getModuleName(), "r:139daa25-c5a7-4ac9-85a2-eb14d22e8f56(jetbrains.mps.lang.dataFlow.analyzers.typesystem)", "1235136520823", null, errorTarget);
{
BaseQuickFixProvider intentionProvider = new BaseQuickFixProvider("jetbrains.mps.lang.structure.typesystem.AddExtendedLanguage_QuickFix", false);
intentionProvider.putArgument("extLang", analyzerLanguage);
intentionProvider.putArgument("lang", ruleLanguage);
_reporter_2309309498.addIntentionProvider(intentionProvider);
}
}
}
}
public SAbstractConcept getApplicableConcept() {
return MetaAdapterFactory.getConcept(0x97a52717898f4598L, 0x8150573d9fd03868L, 0x5faaa6bbd57b6c8L, "jetbrains.mps.lang.dataFlow.analyzers.structure.Rule");
}
public IsApplicableStatus isApplicableAndPattern(SNode argument) {
return new IsApplicableStatus(argument.getConcept().isSubConceptOf(getApplicableConcept()), null);
}
public boolean overrides() {
return false;
}
private static SModule check_b4f08s_a0a0b(SModel checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.getModule();
}
return null;
}
private static SModule check_b4f08s_a0g0b(SModel checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.getModule();
}
return null;
}
}