@Override
public PType caseAAssignmentStm(AAssignmentStm node, TypeCheckInfo question)
throws AnalysisException
{
node.setTargetType(node.getTarget().apply(THIS, new TypeCheckInfo(question.assistantFactory, question.env)));
node.setExpType(node.getExp().apply(THIS, new TypeCheckInfo(question.assistantFactory, question.env, question.scope, null, node.getTargetType(), null)));
if (!question.assistantFactory.getTypeComparator().compatible(node.getTargetType(), node.getExpType()))
{
TypeCheckerErrors.report(3239, "Incompatible types in assignment", node.getLocation(), node);
TypeCheckerErrors.detail2("Target", node.getTarget().getType(), "Expression", node.getExp().getType());
}
node.setClassDefinition(question.env.findClassDefinition());
node.setStateDefinition(question.env.findStateDefinition());
AClassTypeAssistantTC assist = question.assistantFactory.createAClassTypeAssistant();
node.setInConstructor(assist.inConstructor(question.env));
if (node.getInConstructor())
{
PDefinition state;
state = targetDefinition(node.getTarget(), question);
if (state instanceof AInstanceVariableDefinition)
{
AInstanceVariableDefinition iv = (AInstanceVariableDefinition) state;
iv.setInitialized(true);
}
}
node.setType(AstFactory.newAVoidType(node.getLocation()));
return node.getType();
}