import com.fujitsu.vdmj.tc.types.TCType; //导入方法依赖的package包/类
@Override
public TCType typeCheck(Environment env, TCTypeList qualifiers)
{
TCType type = object.typeCheck(env, qualifiers);
TCTypeSet result = new TCTypeSet();
boolean unique = !type.isUnion(location);
if (type.isClass(env))
{
TCClassType ctype = type.getClassType(env);
if (classname == null)
{
field = new TCNameToken(
fieldname.getLocation(), ctype.name.getName(), fieldname.getName(), false);
}
else
{
field = classname;
}
field.setTypeQualifier(qualifiers);
TCDefinition fdef = ctype.classdef.findName(field, NameScope.NAMESANDSTATE);
if (fdef == null)
{
concern(unique, 3260, "Unknown class member name, '" + field + "'");
result.add(new TCUnknownType(location));
}
else if (!TCClassDefinition.isAccessible(env, fdef, false))
{
concern(unique, 3260, "Inaccessible class member name, '" + field + "'");
result.add(new TCUnknownType(location));
}
else
{
result.add(fdef.getType());
}
}
if (type.isRecord(location))
{
String sname = (fieldname != null) ? fieldname.getName() : classname.toString();
TCRecordType rec = type.getRecord();
TCField rf = rec.findField(sname);
if (rf == null)
{
concern(unique, 3261, "Unknown field name, '" + sname + "'");
result.add(new TCUnknownType(location));
}
else
{
result.add(rf.type);
}
}
if (result.isEmpty())
{
report(3262, "Field assignment is not of a class or record type");
detail2("Expression", object, "Type", type);
return new TCUnknownType(location);
}
return result.getType(location);
}