True if there is a cycle somewhere on the superclass chain, false otherwise.
True if there is a cycle somewhere on the superclass chain, false otherwise.
syn lazy boolean ClassDecl.hasCycleOnSuperclassChain() circular [true]; eq ClassDecl.hasCycleOnSuperclassChain() { if (hasSuperclass() && getSuperclass().decl() instanceof ClassDecl) //First, check if there is a superclass return ((ClassDecl) getSuperclass().decl()).hasCycleOnSuperclassChain(); else return false;
Is this declaration for a type that is a subtype of the provided type.
Is this declaration for a type that is a subtype of the provided type. The unknown type is a subtype of all types.
syn lazy boolean TypeDecl.isSubtypeOf(TypeDecl typeDecl); eq TypeDecl.isSubtypeOf(TypeDecl typeDecl) = typeDecl.isSuperTypeOf(this); eq ClassDecl.isSubtypeOf(TypeDecl typeDecl) = typeDecl.isSuperTypeOfClassDecl(this); eq UnknownDecl.isSubtypeOf(TypeDecl typeDecl) = true;
Is this declaration unknown?
Is this declaration unknown?
syn boolean Decl.isUnknown() = false; eq UnknownDecl.isUnknown() = true;
Is this expression a value or not?
Is this expression a value or not?
syn boolean Exp.isValue(); eq Exp.isValue() = true; eq Dot.isValue() = getIdnUse().isValue(); eq TypeUse.isValue() = false; Note! If we did not have the rewrites below, the above equation would have to instead be written as: eq IdnUse.isValue() = !(decl() instanceof TypeDecl)
FIXME: currently using the "without rewrites" version
Return the superclass of a class (or null if none).
Return the superclass of a class (or null if none).
syn lazy ClassDecl ClassDecl.superClass(); eq ClassDecl.superClass() { if (hasSuperclass() && getSuperclass().decl() instanceof ClassDecl && !hasCycleOnSuperclassChain()) return (ClassDecl) getSuperclass().decl(); else return null; }
Return the type of a construct or unknownDecl if none.
Return the type of a construct or unknownDecl if none.
syn lazy TypeDecl Decl.type(); syn lazy TypeDecl Exp.type(); eq TypeDecl.type() = this; eq VarDecl.type() = getType().decl().type(); eq IdnUse.type() = decl().type(); eq Dot.type() = getIdnUse().type(); eq BooleanLiteral.type() = booleanType();