blob: 4afa3bf74f1eb6e6326c3d24c986d308acc721f8 [file] [log] [blame]
context OO!NamedElement {
// Every NamedElement must define a name
constraint HasName {
check : self.name <> ""
message : "Element " + self + " must define a name"
}
}
context OO!Feature {
// The name of a feature (attribute,referecne,parameter)
// should start with a lower case letter
critique NameMustStartWithLowerCase {
guard : self.satisfies("HasName")
check : self.name.substring(0,1) =
self.name.substring(0,1).toLowerCase()
}
}
context OO!Class {
// The name of a class should start with
// an upper case letter
critique NameShouldStartWithUpperCase {
guard : self.satisfies("HasName")
check : self.name.substring(0,1) =
self.name.substring(0,1).toUpperCase()
message : "The name of class " + self.name +
" should start with an upper-case letter"
fix {
title : "Rename class " + self.name + " to " +
self.name.firstToUpperCase()
do {
self.name = self.name.firstToUpperCase();
}
}
}
// A class must not directly or indirectly
// inherit from itself
constraint MustNotInheritItself {
check : not self.inherits(self)
message : "Class " + self.name + " inherits itself"
}
// A class is unused when it is not the type of a feature
// or a parameter and is not extended by another class
critique UnusedClass {
check : Parameter.allInstances.exists(p|p.type = self) or
Feature.allInstances.exists(f|f.type = self) or
Class.allInstances.exists(c|c.`extends` = self)
message : "Unused class " + self.name
fix {
title : "Delete class " + self.name
do {
delete self;
}
}
}
}
// Returns if a class directly or indirectly
// inherits from another class
operation Class inherits(c : Class) : Boolean {
if (self.`extends`.isDefined()) {
return self.`extends` = c or self.`extends`.inherits(c);
}
else {
return false;
}
}