Search in sources :

Example 1 with FunctionByNameArity

use of org.elixir_lang.structure_view.element.call_definition_by_name_arity.FunctionByNameArity in project intellij-elixir by KronicDeth.

the class Module method childCallTreeElements.

/*
     * Private Static Methods
     */
@Contract(pure = true)
@Nullable
private static TreeElement[] childCallTreeElements(@NotNull Modular modular, Call[] childCalls) {
    TreeElement[] treeElements = null;
    if (childCalls != null) {
        int length = childCalls.length;
        final List<TreeElement> treeElementList = new ArrayList<TreeElement>(length);
        FunctionByNameArity functionByNameArity = new FunctionByNameArity(length, treeElementList, modular);
        MacroByNameArity macroByNameArity = new MacroByNameArity(length, treeElementList, modular);
        Set<Overridable> overridableSet = new HashSet<Overridable>();
        Set<org.elixir_lang.structure_view.element.Use> useSet = new HashSet<org.elixir_lang.structure_view.element.Use>();
        for (Call childCall : childCalls) {
            if (Callback.is(childCall)) {
                treeElementList.add(new Callback(modular, childCall));
            } else if (Delegation.is(childCall)) {
                functionByNameArity.addDelegationToTreeElementList(childCall);
            } else if (Exception.is(childCall)) {
                functionByNameArity.setException(new Exception(modular, childCall));
            } else if (CallDefinitionClause.isFunction(childCall)) {
                functionByNameArity.addClausesToCallDefinition(childCall);
            } else if (CallDefinitionSpecification.is(childCall)) {
                functionByNameArity.addSpecificationToCallDefinition(childCall);
            } else if (Implementation.is(childCall)) {
                treeElementList.add(new Implementation(modular, childCall));
            } else if (CallDefinitionClause.isMacro(childCall)) {
                macroByNameArity.addClausesToCallDefinition(childCall);
            } else if (Module.is(childCall)) {
                treeElementList.add(new Module(modular, childCall));
            } else if (Overridable.is(childCall)) {
                Overridable overridable = new Overridable(modular, childCall);
                overridableSet.add(overridable);
                treeElementList.add(overridable);
            } else if (Protocol.is(childCall)) {
                treeElementList.add(new Protocol(modular, childCall));
            } else if (org.elixir_lang.structure_view.element.Quote.is(childCall)) {
                treeElementList.add(new Quote(modular, childCall));
            } else if (Structure.is(childCall)) {
                treeElementList.add(new Structure(modular, childCall));
            } else if (Type.is(childCall)) {
                treeElementList.add(Type.fromCall(modular, childCall));
            } else if (org.elixir_lang.structure_view.element.Use.is(childCall)) {
                org.elixir_lang.structure_view.element.Use use = new org.elixir_lang.structure_view.element.Use(modular, childCall);
                useSet.add(use);
                treeElementList.add(use);
            } else if (Unknown.is(childCall)) {
                // Should always be last since it will match all macro calls
                treeElementList.add(new Unknown(modular, childCall));
            }
        }
        for (Overridable overridable : overridableSet) {
            for (TreeElement treeElement : overridable.getChildren()) {
                CallReference callReference = (CallReference) treeElement;
                Integer arity = callReference.arity();
                if (arity != null) {
                    String name = callReference.name();
                    CallDefinition function = functionByNameArity.get(pair(name, arity));
                    if (function != null) {
                        function.setOverridable(true);
                    }
                }
            }
        }
        Collection<TreeElement> useCollection = new HashSet<TreeElement>(useSet.size());
        useCollection.addAll(useSet);
        Collection<TreeElement> nodesFromUses = Used.provideNodesFromChildren(useCollection);
        Map<Pair<String, Integer>, CallDefinition> useFunctionByNameArity = Used.functionByNameArity(nodesFromUses);
        for (Map.Entry<Pair<String, Integer>, CallDefinition> useNameArityFunction : useFunctionByNameArity.entrySet()) {
            CallDefinition useFunction = useNameArityFunction.getValue();
            if (useFunction.isOverridable()) {
                Pair<String, Integer> useNameArity = useNameArityFunction.getKey();
                CallDefinition function = functionByNameArity.get(useNameArity);
                if (function != null) {
                    function.setOverride(true);
                }
            }
        }
        treeElements = treeElementList.toArray(new TreeElement[treeElementList.size()]);
    }
    return treeElements;
}
Also used : MacroByNameArity(org.elixir_lang.structure_view.element.call_definition_by_name_arity.MacroByNameArity) CallDefinition(org.elixir_lang.structure_view.element.CallDefinition) FunctionByNameArity(org.elixir_lang.structure_view.element.call_definition_by_name_arity.FunctionByNameArity) Structure(org.elixir_lang.structure_view.element.structure.Structure) org.elixir_lang.structure_view.element(org.elixir_lang.structure_view.element) Pair(com.intellij.openapi.util.Pair) Call(org.elixir_lang.psi.call.Call) ElixirPsiImplUtil.enclosingMacroCall(org.elixir_lang.psi.impl.ElixirPsiImplUtil.enclosingMacroCall) Overridable(org.elixir_lang.structure_view.element.Overridable) Exception(org.elixir_lang.structure_view.element.Exception) TreeElement(com.intellij.ide.util.treeView.smartTree.TreeElement) Quote(org.elixir_lang.structure_view.element.Quote) Contract(org.jetbrains.annotations.Contract) Nullable(org.jetbrains.annotations.Nullable)

Aggregations

TreeElement (com.intellij.ide.util.treeView.smartTree.TreeElement)1 Pair (com.intellij.openapi.util.Pair)1 Call (org.elixir_lang.psi.call.Call)1 ElixirPsiImplUtil.enclosingMacroCall (org.elixir_lang.psi.impl.ElixirPsiImplUtil.enclosingMacroCall)1 org.elixir_lang.structure_view.element (org.elixir_lang.structure_view.element)1 CallDefinition (org.elixir_lang.structure_view.element.CallDefinition)1 Exception (org.elixir_lang.structure_view.element.Exception)1 Overridable (org.elixir_lang.structure_view.element.Overridable)1 Quote (org.elixir_lang.structure_view.element.Quote)1 FunctionByNameArity (org.elixir_lang.structure_view.element.call_definition_by_name_arity.FunctionByNameArity)1 MacroByNameArity (org.elixir_lang.structure_view.element.call_definition_by_name_arity.MacroByNameArity)1 Structure (org.elixir_lang.structure_view.element.structure.Structure)1 Contract (org.jetbrains.annotations.Contract)1 Nullable (org.jetbrains.annotations.Nullable)1