--- /dev/null
+<div class='card card-xl' ng-class='{active: focus.full_name == definition.full_name}'>
+ <div class='card-body'>
+ <h5 class='text-muted'>
+ <span ng-if='definition.is_intro'>
+ <span class='glyphicon glyphicon-plus' /> Introduction</span>
+ </span>
+ <span ng-if='!definition.is_intro'>
+ <span class='glyphicon glyphicon-asterisk' /> Redefinition</span>
+ </span>
+ <span ng-if='definition.mclass'>
+ of <entity-link mentity='definition.mclass' />
+ </span>
+ <span ng-if='definition.mproperty'>
+ of <entity-link mentity='definition.mproperty' />
+ </span>
+ <span ng-if='definition.mclassdef'>
+ in <entity-link mentity='definition.mmodule' />
+ :: <entity-link mentity='definition.mclassdef' />
+ </span>
+ <span ng-if='!definition.mclassdef'>
+ in <entity-link mentity='definition.mmodule' />
+ </span>
+ </h5>
+ <entity-location mentity='definition' />
+ </div>
+</div>
--- /dev/null
+<div class='entity-list' ng-if='listEntities.length'>
+ <h3>{{listTitle}}</h3>
+ <div class='card-list'>
+ <div ng-repeat='def in listEntities'>
+ <entity-def definition='def' focus='listFocus' />
+ <h4 ng-if='!$last' class='text-muted text-center'>
+ <span class='glyphicon glyphicon-chevron-up'></span>
+ </h4>
+ </div>
+ </div>
+</div>
.module('entities', ['ui', 'model'])
.controller('EntityCtrl', ['Model', '$routeParams', '$scope', function(Model, $routeParams, $scope) {
+ this.loadEntityLinearization = function() {
+ Model.loadEntityLinearization($routeParams.id,
+ function(data) {
+ $scope.linearization = data;
+ }, function(err) {
+ $scope.error = err;
+ });
+ };
+
Model.loadEntity($routeParams.id,
function(data) {
$scope.mentity = data;
}
};
})
+
+ .directive('entityLinearization', function() {
+ return {
+ restrict: 'E',
+ scope: {
+ listEntities: '=',
+ listTitle: '@',
+ listFocus: '='
+ },
+ templateUrl: '/directives/entity/linearization.html'
+ };
+ })
+
+ .directive('entityDef', ['Model', function(Model, Code) {
+ return {
+ restrict: 'E',
+ scope: {
+ definition: '=',
+ focus: '='
+ },
+ link: function ($scope, element, attrs) {
+ $scope.$watch("definition", function() {
+ /*.loadEntityDefs($scope.definition.full_name,
+ function(data) {
+ $scope.mentity = data;
+ }, function(err) {
+ $scope.error = err;
+ });
+ Model.loadEntityCode($scope.definition.full_name,
+ function(data) {
+ $scope.code = data;
+ }, function(err) {
+ $scope.error = err;
+ });*/
+ });
+ },
+ templateUrl: '/directives/entity/defcard.html'
+ };
+ }])
})();
.error(cbErr);
},
+ loadEntityLinearization: function(id, cb, cbErr) {
+ $http.get(apiUrl + '/linearization/' + id)
+ .success(cb)
+ .error(cbErr);
+ },
+
search: function(q, n, cb, cbErr) {
$http.get(apiUrl + '/search?q=' + q + '&n=' + n)
.success(cb)
</div>
<ul class='nav nav-tabs'>
- <li class='active'>
+ <li role='presentation' class='active'>
<a data-toggle='tab' data-target='#doc'>
<span class='glyphicon glyphicon-book'/> Doc
</a>
</li>
+ <li role='presentation'>
+ <a data-toggle='tab' role='tab' data-target='#linearization' aria-controls='linearization' ng-click='entityCtrl.loadEntityLinearization()'>
+ <span class='glyphicon glyphicon-arrow-down'/> Linearization
+ </a>
+ </li>
</ul>
<div class='tab-content'>
- <div class='tab-pane fade in active' id='doc'>
+ <div role='tabpanel' class='tab-pane fade in active' id='doc'>
<entity-doc mentity='mentity.intro'/>
<entity-list list-title='Parents'
list-entities='mentity.redef_mproperties'
list-object-filter='{is_init: "!true"}' />
</div>
+ <div role='tabpanel' class='tab-pane fade' id='linearization'>
+ <entity-linearization
+ list-title='Class definitions'
+ list-entities='linearization'
+ list-focus='mentity.intro' />
+ </div>
</div>
</div>
-<div class='container-fluid'>
+<div class='container-fluid' ng-init='entityCtrl.loadEntityLinearization()'>
<div class='page-header'>
<h2><entity-signature mentity='mentity'/></h2>
<entity-link mentity='mentity.mpackage' />
</div>
<ul class='nav nav-tabs' role='tablist'>
- <li class='warning'>
+ <li role='presentation' class='warning'>
<a ng-href='{{mentity.mclass.web_url}}'>
<span class='glyphicon glyphicon-chevron-left'/> Go to class
</a>
</li>
+ <li role='presentation' class='active'>
+ <a data-toggle='tab' role='tab' data-target='#linearization' aria-controls='linearization'>
+ <span class='glyphicon glyphicon-arrow-down'/> Linearization
+ </a>
+ </li>
</ul>
+
+ <div class='tab-content'>
+ <div role='tabpanel' class='tab-pane fade in active' id='linearization'>
+ <entity-linearization
+ list-title='Class definitions'
+ list-entities='linearization'
+ list-focus='mentity' />
+ </div>
+ </div>
</div>
-<div class='container-fluid'>
-
+<div class='container-fluid' ng-init='entityCtrl.loadEntityLinearization()'>
<div class='page-header'>
<h2><entity-signature mentity='mentity'/></h2>
<entity-link mentity='mentity.mpackage' />
</div>
<ul class='nav nav-tabs'>
- <li class='warning'>
+ <li role='presentation' class='warning'>
<a href='{{mentity.mproperty.web_url}}'>
<span class='glyphicon glyphicon-chevron-left'/> Go to property
</a>
</li>
+ <li role='presentation' class='active'>
+ <a data-toggle='tab' role='tab' data-target='#linearization' aria-controls='linearization'>
+ <span class='glyphicon glyphicon-arrow-down'/> Linearization
+ </a>
+ </li>
</ul>
+
+ <div class='tab-content'>
+ <div role='tabpanel' class='tab-pane fade in active' id='linearization'>
+ <entity-linearization
+ list-title='Class definitions'
+ list-entities='linearization'
+ list-focus='mentity' />
+ </div>
+ </div>
</div>
</div>
<ul class='nav nav-tabs'>
- <li class='active'>
+ <li role='presentation' class='active'>
<a data-toggle='tab' data-target='#doc'>
<span class='glyphicon glyphicon-book'/> Doc
</a>
</li>
+ <li role='presentation'>
+ <a data-toggle='tab' role='tab' data-target='#linearization' aria-controls='linearization' ng-click='entityCtrl.loadEntityLinearization()'>
+ <span class='glyphicon glyphicon-arrow-down'/> Linearization
+ </a>
+ </li>
</ul>
<div class='tab-content'>
<div role='tabpanel' class='tab-pane fade in active' id='doc'>
<entity-doc mentity='mentity.intro'/>
</div>
+ <div role='tabpanel' class='tab-pane fade' id='linearization'>
+ <entity-linearization
+ list-title='Class definitions'
+ list-entities='linearization'
+ list-focus='mentity.intro' />
+ </div>
</div>
</div>
fun collect_modifiers: Array[String] do
return new Array[String]
end
+
+ # Collect `self` linearization anchored on `mainmodule`.
+ fun collect_linearization(mainmodule: MModule): nullable Array[MEntity] do
+ return null
+ end
end
redef class MPackage
redef fun collect_modifiers do return intro.collect_modifiers
+ redef fun collect_linearization(mainmodule) do
+ var mclassdefs = self.mclassdefs.to_a
+ mainmodule.linearize_mclassdefs(mclassdefs)
+ return mclassdefs
+ end
+
# Collect direct parents of `self` with `visibility >= to min_visibility`.
fun collect_parents(view: ModelView): Set[MClass] do
var res = new HashSet[MClass]
redef class MClassDef
+ redef fun collect_linearization(mainmodule) do
+ var mclassdefs = new Array[MClassDef]
+ for mclassdef in in_hierarchy.as(not null).greaters do
+ if mclassdef.mclass == self.mclass then mclassdefs.add mclassdef
+ end
+ mainmodule.linearize_mclassdefs(mclassdefs)
+ return mclassdefs
+ end
+
# Collect mpropdefs in 'self' with `visibility >= min_visibility`.
fun collect_mpropdefs(view: ModelView): Set[MPropDef] do
var res = new HashSet[MPropDef]
redef class MProperty
redef fun collect_modifiers do return intro.collect_modifiers
+
+ redef fun collect_linearization(mainmodule) do
+ var mpropdefs = self.mpropdefs.to_a
+ mainmodule.linearize_mpropdefs(mpropdefs)
+ return mpropdefs
+ end
end
redef class MPropDef
end
return res
end
+
+ redef fun collect_linearization(mainmodule) do
+ var mpropdefs = new Array[MPropDef]
+ var mentity = self
+ while not mentity.is_intro do
+ mpropdefs.add mentity
+ mentity = mentity.lookup_next_definition(mainmodule, mentity.mclassdef.bound_mtype)
+ end
+ mpropdefs.add mentity
+ mainmodule.linearize_mpropdefs(mpropdefs)
+ return mpropdefs
+ end
end
use("/entity/:id", new APIEntity(model, mainmodule))
use("/code/:id", new APIEntityCode(model, mainmodule, modelbuilder))
use("/uml/:id", new APIEntityUML(model, mainmodule))
+ use("/linearization/:id", new APIEntityLinearization(model, mainmodule))
end
end
end
end
+# Linearize super definitions of a MClassDef or a MPropDef if any.
+#
+# Example: `GET /entity/core::Array/linearization`
+class APIEntityLinearization
+ super APIHandler
+
+ redef fun get(req, res) do
+ var mentity = mentity_from_uri(req, res)
+ if mentity == null then
+ res.error 404
+ return
+ end
+ var lin = mentity.collect_linearization(mainmodule)
+ if lin == null then
+ res.error 404
+ return
+ end
+ res.json new JsonArray.from(lin)
+ end
+end
# Return a UML representation of MEntity.
#