public void build()

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);
      }
    }