replaced <code></code> with more concise {@code}
[idea/community.git] / plugins / gradle / src / org / jetbrains / plugins / gradle / service / resolve / GradleMethodContextContributor.java
1 /*
2  * Copyright 2000-2013 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.jetbrains.plugins.gradle.service.resolve;
17
18 import com.intellij.openapi.extensions.ExtensionPointName;
19 import com.intellij.psi.PsiElement;
20 import com.intellij.psi.ResolveState;
21 import com.intellij.psi.scope.PsiScopeProcessor;
22 import org.jetbrains.annotations.NotNull;
23 import org.jetbrains.annotations.Nullable;
24 import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock;
25 import org.jetbrains.plugins.groovy.lang.resolve.NonCodeMembersContributor;
26 import org.jetbrains.plugins.groovy.lang.resolve.delegatesTo.DelegatesToInfo;
27
28 import java.util.List;
29
30 /**
31  * This interface narrows {@link NonCodeMembersContributor} to a closure executed inside particular method call at a gradle script.
32  * <p/>
33  * Example:
34  * <b>build.gradle</b>
35  * <pre>
36  *   subprojects {
37  *     repositories {
38  *       mavenCentral()
39  *     }
40  *   }
41  * </pre>
42  * Here {@code 'subprojects'} should be resolved at context of a global script; {@code 'repositories'} in a context of
43  * {@code 'subprojects'} and {@code 'mavenCentral'} in a context of {@code 'repositories'}. Every such context
44  * is expected to be backed by corresponding implementation of the current interface.
45  *
46  * @author Denis Zhdanov
47  * @since 7/23/13 7:32 PM
48  */
49 public interface GradleMethodContextContributor {
50
51   ExtensionPointName<GradleMethodContextContributor> EP_NAME =
52     ExtensionPointName.create("org.jetbrains.plugins.gradle.resolve.contributor");
53
54   /**
55    * Tries to resolve target element.
56    *
57    * @param methodCallInfo information about method call hierarchy which points to the target place. Every entry is a method name
58    *                       and the deepest one is assumed to be added the head
59    * @param processor      the processor receiving the declarations.
60    * @param state          current resolve state
61    * @param place          the original element from which the tree up walk was initiated.
62    * @return true if the processing should continue or false if it should be stopped.
63    */
64   default boolean process(@NotNull List<String> methodCallInfo,
65                           @NotNull PsiScopeProcessor processor,
66                           @NotNull ResolveState state,
67                           @NotNull PsiElement place) {
68     return true;
69   }
70
71   @Nullable
72   default DelegatesToInfo getDelegatesToInfo(@NotNull GrClosableBlock closure) {
73     return null;
74   }
75 }