in AngularJS/src/org/angularjs/codeInsight/router/AngularUiRouterGraphBuilder.java [81:204]
public void build(final @NotNull DiagramProvider<DiagramObject> provider, final @NotNull Project project) {
final DiagramObject rootDiagramObject;
if (myRootTemplate != null) {
myRootNode = getOrCreateTemplateNode(provider, myKey, normalizeTemplateUrl(myRootTemplate.getRelativeUrl()),
myRootTemplate.getTemplate());
myRootNode.getIdentifyingElement().setType(Type.topLevelTemplate);
}
else {
// todo remove from diagram if not used
final PsiFile psiFile = PsiManager.getInstance(project).findFile(myKey);
rootDiagramObject = new DiagramObject(
Type.topLevelTemplate, myKey.getName(),
psiFile == null ? null : SmartPointerManager.getInstance(project).createSmartPsiElementPointer(psiFile));
myRootNode = new AngularUiRouterNode(rootDiagramObject, provider);
}
setParentStates();
for (Map.Entry<String, UiRouterState> entry : myStatesMap.entrySet()) {
final UiRouterState state = entry.getValue();
final DiagramObject stateObject = new DiagramObject(Type.state, state.getName(), state.getPointer());
if (state.getParentName() != null) {
stateObject.setParent(state.getParentName());
}
if (state.getPointer() == null) {
stateObject.addError(message("angularjs.ui.router.diagram.error.cant.find.state.definition"));
}
final AngularUiRouterNode node = new AngularUiRouterNode(stateObject, provider);
stateNodes.put(state.getName(), node);
final String templateUrl = normalizeTemplateUrl(state.getTemplateUrl());
if (templateUrl != null && !state.hasViews()) {
final AngularUiRouterNode templateNode = getOrCreateTemplateNode(provider, state.getTemplateFile(), templateUrl, null);
edges.add(new AngularUiRouterEdge(templateNode, node, message("angularjs.ui.router.diagram.edge.provides"),
AngularUiRouterEdge.Type.providesTemplate));
}
else if (state.isHasTemplateDefined() && state.getTemplatePointer() != null) {
final PsiElement element = state.getTemplatePointer().getElement();
if (element != null && element.isValid()) {
final AngularUiRouterNode localTemplateNode = createLocalTemplate(element, provider);
edges.add(new AngularUiRouterEdge(localTemplateNode, node, message("angularjs.ui.router.diagram.edge.provides"),
AngularUiRouterEdge.Type.providesTemplate));
}
}
if (state.hasViews()) {
if (state.isAbstract()) {
stateObject.addWarning(message("angularjs.ui.router.diagram.warning.abstract.state"));
}
else if (templateUrl != null || state.isHasTemplateDefined()) {
stateObject.addWarning(message("angularjs.ui.router.diagram.warning.views.are.defined"));
}
}
if (state.isHasTemplateDefined() && state.getTemplatePointer() == null) {
stateObject.addNote(message("angularjs.ui.router.diagram.note.has.embedded.template.definition"));
}
}
for (Map.Entry<String, UiRouterState> entry : myStatesMap.entrySet()) {
final UiRouterState state = entry.getValue();
final AngularUiRouterNode node = stateNodes.get(state.getName());
assert node != null;
final List<UiView> views = state.getViews();
if (views != null && !views.isEmpty()) {
for (UiView view : views) {
final String name = StringUtil.isEmptyOrSpaces(view.getName()) ? DEFAULT : view.getName();
final DiagramObject viewObject = new DiagramObject(Type.view, name, view.getPointer());
viewNodes.put(Pair.create(state.getName(), name), viewObject);
final String template = view.getTemplate();
if (!StringUtil.isEmptyOrSpaces(template)) {
final AngularUiRouterNode templateNode = getOrCreateTemplateNode(provider, view.getTemplateFile(), template, null);
edges.add(new AngularUiRouterEdge(templateNode, node, message("angularjs.ui.router.diagram.edge.smth.provides", name),
AngularUiRouterEdge.Type.providesTemplate).setTargetName(name));
}
else if (view.getTemplatePointer() != null) {
final PsiElement element = view.getTemplatePointer().getElement();
if (element != null && element.isValid()) {
final AngularUiRouterNode localTemplateNode = createLocalTemplate(element, provider);
edges.add(new AngularUiRouterEdge(localTemplateNode, node, message("angularjs.ui.router.diagram.edge.smth.provides", name),
AngularUiRouterEdge.Type.providesTemplate).setTargetName(name));
}
}
node.getIdentifyingElement().addChild(viewObject, node);
}
}
}
// views can also refer to different states, so first all state nodes must be created
for (Map.Entry<String, UiRouterState> entry : myStatesMap.entrySet()) {
final UiRouterState state = entry.getValue();
final AngularUiRouterNode node = stateNodes.get(state.getName());
assert node != null;
final List<UiView> views = state.getViews();
if (views != null && !views.isEmpty()) {
for (UiView view : views) {
final String name = StringUtil.isEmptyOrSpaces(view.getName()) ? DEFAULT : view.getName();
final DiagramObject viewNode = viewNodes.get(Pair.create(state.getName(), name));
assert viewNode != null;
final Pair<AngularUiRouterNode, String> pair = getParentTemplateNode(state.getName(), view.getName());
if (pair != null && pair.getFirst() != null) {
connectViewOrStateWithPlaceholder(node, name, pair);
}
}
}
else {
//find unnamed parent template for view
final Pair<AngularUiRouterNode, String> pair = getParentTemplateNode(state.getName(), "");
if (pair != null && pair.getFirst() != null) {
connectViewOrStateWithPlaceholder(node, DEFAULT, pair);
}
}
}
createStateParentEdges();
final List<AngularUiRouterNode> list = new ArrayList<>();
list.add(myRootNode);
list.addAll(stateNodes.values());
list.addAll(templateNodes.values());
for (AngularUiRouterNode node : list) {
if (!allNodes.contains(node)) allNodes.add(node);
}
}