@Override public PType caseAMultiBindListDefinition(AMultiBindListDefinition node, TypeCheckInfo question) throws AnalysisException { if (node.getType() != null) { question.assistantFactory.getTypeComparator().checkComposeTypes(node.getType(), question.env, false); } List<PDefinition> defs = new Vector<PDefinition>(); for (PMultipleBind mb : node.getBindings()) { PType type = mb.apply(THIS, question); defs.addAll(question.assistantFactory.createPMultipleBindAssistant().getDefinitions(mb, type, question)); } question.assistantFactory.createPDefinitionListAssistant().typeCheck(defs, THIS, question); node.setDefs(defs); return null; }
question.assistantFactory.createPDefinitionListAssistant().typeCheck(paramDefinitions, THIS, question);
question.assistantFactory.createPDefinitionListAssistant().typeCheck(node.getDefs(), THIS, question);
@Override public PType caseAForPatternBindStm(AForPatternBindStm node, TypeCheckInfo question) throws AnalysisException { PType stype = node.getExp().apply(THIS, new TypeCheckInfo(question.assistantFactory, question.env, question.scope)); Environment local = question.env; if (question.assistantFactory.createPTypeAssistant().isSeq(stype)) { node.setSeqType(question.assistantFactory.createPTypeAssistant().getSeq(stype)); node.getPatternBind().apply(THIS, new TypeCheckInfo(question.assistantFactory, question.env, question.scope)); List<PDefinition> defs = getDefinitions(node.getPatternBind()); question.assistantFactory.createPDefinitionListAssistant().typeCheck(defs, THIS, new TypeCheckInfo(question.assistantFactory, question.env, question.scope)); local = new FlatCheckedEnvironment(question.assistantFactory, defs, question.env, question.scope); } else { TypeCheckerErrors.report(3223, "Expecting sequence type after 'in'", node.getLocation(), node); } PType rt = node.getStatement().apply(THIS, new TypeCheckInfo(question.assistantFactory, local, question.scope)); local.unusedCheck(); node.setType(rt); return rt; }
question.assistantFactory.createPDefinitionListAssistant().typeCheck(c.getDefs(), rootVisitor, new TypeCheckInfo(question.assistantFactory, question.env, question.scope));
@Override public PType caseAStateDefinition(AStateDefinition node, TypeCheckInfo question) throws AnalysisException { Environment base = question.env; if (base.findStateDefinition() != node) { TypeCheckerErrors.report(3047, "Only one state definition allowed per module", node.getLocation(), node); return null; } for (PDefinition def : node.getStateDefs()) { if (!def.getName().getOld()) // Don't check old names { question.assistantFactory.getTypeComparator().checkComposeTypes(def.getType(), question.env, false); } } question.assistantFactory.createPDefinitionListAssistant().typeCheck(node.getStateDefs(), THIS, question); if (node.getInvdef() != null) { node.getInvdef().apply(THIS, question); question.assistantFactory.createPPatternAssistant().typeResolve(node.getInvPattern(), THIS, question); } if (node.getInitdef() != null) { node.getInitdef().apply(THIS, question); question.assistantFactory.createPPatternAssistant().typeResolve(node.getInitPattern(), THIS, question); } return null; }
question.assistantFactory.createPDefinitionListAssistant().typeCheck(defs, THIS, question); Environment local = new FlatCheckedEnvironment(question.assistantFactory, defs, question.env, question.scope); node.getStatement().apply(THIS, new TypeCheckInfo(question.assistantFactory, local, question.scope, question.qualifiers));
@Override public PType caseATrapStm(ATrapStm node, TypeCheckInfo question) throws AnalysisException { PTypeSet rtypes = new PTypeSet(question.assistantFactory); PStm body = node.getBody(); PType bt = body.apply(THIS, question); rtypes.add(bt); PTypeSet extype = exitCheck(body, question); PType ptype = null; if (extype.isEmpty()) { TypeCheckerErrors.report(3241, "Body of trap statement does not throw exceptions", node.getLocation(), node); ptype = AstFactory.newAUnknownType(body.getLocation()); } else { ptype = extype.getType(body.getLocation()); } node.setType(ptype); node.getPatternBind().apply(THIS, question); // TODO: PatternBind stuff List<PDefinition> defs = getDefinitions(node.getPatternBind()); question.assistantFactory.createPDefinitionListAssistant().typeCheck(defs, THIS, question); Environment local = new FlatCheckedEnvironment(question.assistantFactory, defs, question.env, question.scope); rtypes.add(node.getWith().apply(THIS, new TypeCheckInfo(question.assistantFactory, local, question.scope, question.qualifiers))); node.setType(rtypes.getType(node.getLocation())); return node.getType(); }
question.assistantFactory.createPDefinitionListAssistant().typeCheck(defs, THIS, question); Environment local = new FlatEnvironment(question.assistantFactory, defs, question.env); // NB. No
question.assistantFactory.createPDefinitionListAssistant().typeCheck(node.getDefs(), THIS, question); return node.getType();
local.setFunctional(true); question.assistantFactory.createPDefinitionListAssistant().typeCheck(defs, THIS, new TypeCheckInfo(question.assistantFactory, local, question.scope, question.qualifiers));
question.assistantFactory.createPDefinitionListAssistant().typeCheck(node.getParamDefinitions(), THIS, new TypeCheckInfo(question.assistantFactory, question.env, NameScope.NAMESANDSTATE, question.qualifiers));
question.assistantFactory.createPDefinitionListAssistant().typeCheck(defs, this, new TypeCheckInfo(question.assistantFactory, local, question.scope, question.qualifiers)); // can
question.assistantFactory.createPDefinitionListAssistant().typeCheck(defs, THIS, question);
question.assistantFactory.createPDefinitionListAssistant().typeCheck(node.getDefs(), THIS, question); return node.getType();