Skip to content
Snippets Groups Projects
Commit 378a16d1 authored by Johannes Mey's avatar Johannes Mey
Browse files

remove unmanaged redundancy

parent 4cbe4576
No related branches found
No related tags found
No related merge requests found
......@@ -50,10 +50,13 @@ jastadd {
imports "java8 frontend"
jastadd {
include "src/gen/jastadd/Java.ast"
include "src/gen/jastadd/Java.jadd"
include "src/main/jastadd/*.jrag"
include "src/main/jastadd/*.jadd"
basedir ".."
include "deps4j/src/gen/jastadd/Java.ast"
include "deps4j/src/gen/jastadd/Java.jadd"
include "deps4j/src/main/jastadd/*.jrag"
include "deps4j/src/main/jastadd/*.jadd"
include "dg/src/main/jastadd/*.jrag"
include "dg/src/main/jastadd/*.jadd"
excludeFrom "java8 frontend", "grammar/ConstructorReference.ast"
excludeFrom "java8 frontend", "grammar/IntersectionCasts.ast"
......
aspect DGtoDotG {
syn DotGraph DependencyGraph.dotGraph() {
DotGraph dg = new DotGraph();
//create DotGraph
dg.setDependencyGraph(this);
Map<Component,DotNode> componentMap = new HashMap<>();
for (Component component: getComponentList()) {
DotNode n = new DotNode();
n.setComponent(component);
dg.addDotNode(n);
componentMap.put(component, n);
}
for (Component from: getComponentList()) {
for (Component to: from.getToList()) {
if (to.getToList().contains(from)) {
if (to.hashCode() < from.hashCode()) {
componentMap.get(from).addRel(componentMap.get(to));
}
} else {
componentMap.get(from).addRef(componentMap.get(to));
}
}
}
return dg;
}
syn DotGraph DependencyGraph.dotGraph(Set<Component> components) {
DotGraph dg = new DotGraph();
//Ensure that components are part of DependencyGraph
Set<Component> subset=new HashSet();
for (Component c:getComponentList())
subset.add(c);
subset.retainAll(components);
//create DotGraph
dg.setDependencyGraph(this);
Map<Component,DotNode> componentMap = new HashMap<>();
for (Component component: subset) {
DotNode n = new DotNode();
n.setComponent(component);
dg.addDotNode(n);
componentMap.put(component, n);
}
for (Component from: subset) {
for (Component to: from.getToList()) {
if (subset.contains(to)) {
if (to.getToList().contains(from)) {
if (to.hashCode() < from.hashCode()) {
componentMap.get(from).addRel(componentMap.get(to));
}
} else {
componentMap.get(from).addRef(componentMap.get(to));
}
}
}
}
return dg;
}
}
import java.util.*;
import java.util.stream.Collectors;
aspect Naviagation {
inh DependencyGraph Component.dg();
eq DependencyGraph.getComponent().dg() = this;
}
aspect Reachability {
// old, dependency-based algorithm for SCC
// coll Set<Component> Component.successors() circular [new HashSet<>()] with add root DependencyGraph;
// Component contributes this to Component.successors() for each getToList();
// Component contributes each this.successors() to Component.successors() for each getToList();
// coll Set<Component> Component.predecessors() [new HashSet<>()] with add root DependencyGraph;
// Component contributes this to Component.predecessors() for each successors();
// coll HashSet<Component> Component.SCC() with add root DependencyGraph;
// Component contributes each predecessors() when (successors().contains(this)) to Component.SCC() for this;
// coll HashSet<Set<Component>> DependencyGraph.SCC() with add root DependencyGraph;
// Component contributes SCC() when SCC().size() > 0 to DependencyGraph.SCC();
/**
* Kosaraju's algorithm
*/
syn Set<Set<Component>> DependencyGraph.SCC() {
Map<Component, Set> visited = new HashMap<>();
LinkedList<Component> locked = new LinkedList<>();
for (Component c : getComponentList())
if (!visited.containsKey(c))
c.visit(visited, locked); // forward search
for (Component c : locked)
if (visited.get(c) == null)
c.assign(visited, new HashSet()); // backward search
return new HashSet(visited.values());
}
void Component.visit(Map<Component, Set> visited, LinkedList<Component> locked) {
visited.put(this, null);
for (Component c : getFromList())
if (!visited.containsKey(c))
c.visit(visited, locked);
locked.addFirst(this);
}
void Component.assign(Map<Component, Set> visited, Set scc) {
scc.add(this);
visited.put(this, scc);
for (Component c : getToList())
if (visited.get(c) == null)
c.assign(visited, scc);
}
}
aspect DotGraphToPlantUML {
inh String DotNode.name();
eq DotGraph.getDotNode(int i).name() = "v" + i;
syn String DotNode.label() = name();
syn String DotGraph.toDot() {
StringBuilder b = new StringBuilder();
b.append("strict digraph cycles {\n");
for (DotNode from: getDotNodeList()) {
b.append(" ").append(from.name()).append("[label=\"").append(from.label()).append("\"];\n");
for (DotNode to: from.getRefList()) {
b.append(" ").append(from.name()).append(" -> ").append(to.name()).append(";\n");
}
for (DotNode to: from.getRelList()) {
b.append(" ").append(from.name()).append(" -> ").append(to.name()).append("[dir=\"both\"];\n");
}
}
b.append("}\n");
return b.toString();
}
syn String DotGraph.toPlant(String shape, String relation) {
StringBuilder b = new StringBuilder();
b.append("@startuml\n")
.append("hide circle\n")
.append("skinparam shadowing false\n")
.append("skinparam monochrome true\n")
.append("skinparam classAttributeIconSize 0\n")
.append("/'Remove automatic namespace generation'/\n")
.append("set namespaceSeparator none\n");
for (DotNode from: getDotNodeList()) {
b.append(shape).append(" ")
.append(from.label()).append("\n");
}
for (DotNode from: getDotNodeList()) {
for (DotNode to: from.getRefList()) {
b.append(from.label())
.append(" ").append(relation).append("> ")
.append(to.label()).append("\n");
}
for (DotNode to: from.getRelList()) {
b.append(from.label())
.append(" <").append(relation).append("> ")
.append(to.label()).append("\n");
}
}
b.append("@enduml\n");
return b.toString();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment