diff --git a/plugins/groovy/resources/standardDsls/GppExtensions.gdsl b/plugins/groovy/resources/standardDsls/GppExtensions.gdsl
index 4a738abd1616..7ccbbde20976 100644
--- a/plugins/groovy/resources/standardDsls/GppExtensions.gdsl
+++ b/plugins/groovy/resources/standardDsls/GppExtensions.gdsl
@@ -19,16 +19,18 @@ package standardDsls
* @author Maxim.Medvedev
*/
-gppCategory "groovy.util.Conversions"
-gppCategory "groovy.util.Files"
-gppCategory "groovy.util.Filters"
-gppCategory "groovy.util.Iterations"
-gppCategory "groovy.util.Mappers"
-gppCategory "groovy.util.Sort"
-gppCategory "groovy.util.Strings"
-gppCategory "groovy.util.With"
-gppCategory "groovy.util.concurrent.Atomics"
-gppCategory "org.mbte.groovypp.runtime.ArraysMethods"
-gppCategory "org.mbte.groovypp.runtime.DefaultGroovyPPMethods"
+contributor([:]) {
+ gppCategory "groovy.util.Conversions"
+ gppCategory "groovy.util.Files"
+ gppCategory "groovy.util.Filters"
+ gppCategory "groovy.util.Iterations"
+ gppCategory "groovy.util.Mappers"
+ gppCategory "groovy.util.Sort"
+ gppCategory "groovy.util.Strings"
+ gppCategory "groovy.util.With"
+ gppCategory "groovy.util.concurrent.Atomics"
+ gppCategory "org.mbte.groovypp.runtime.ArraysMethods"
+ gppCategory "org.mbte.groovypp.runtime.DefaultGroovyPPMethods"
-gppCategory "org.mbte.groovypp.runtime.DefaultGroovyPPStaticMethods", true
\ No newline at end of file
+ gppCategory "org.mbte.groovypp.runtime.DefaultGroovyPPStaticMethods", true
+}
\ No newline at end of file
diff --git a/plugins/groovy/resources/standardDsls/extensions.gdsl b/plugins/groovy/resources/standardDsls/extensions.gdsl
index a5305eb3abc5..10e8edee3f5e 100644
--- a/plugins/groovy/resources/standardDsls/extensions.gdsl
+++ b/plugins/groovy/resources/standardDsls/extensions.gdsl
@@ -21,12 +21,12 @@ package standardDsls
* @author Maxim.Medvedev
*/
-category "org.codehaus.groovy.runtime.DefaultGroovyMethods"
-category "org.codehaus.groovy.runtime.DefaultGroovyStaticMethods", true
-category "org.codehaus.groovy.runtime.DateGroovyMethods"
-category "org.codehaus.groovy.runtime.EncodingGroovyMethods"
-category "org.codehaus.groovy.runtime.SqlGroovyMethods"
-category "org.codehaus.groovy.runtime.SwingGroovyMethods"
-category "org.codehaus.groovy.runtime.XmlGroovyMethods"
-
-
+contributor([:]) {
+ category "org.codehaus.groovy.runtime.DefaultGroovyMethods"
+ category "org.codehaus.groovy.runtime.DefaultGroovyStaticMethods", true
+ category "org.codehaus.groovy.runtime.DateGroovyMethods"
+ category "org.codehaus.groovy.runtime.EncodingGroovyMethods"
+ category "org.codehaus.groovy.runtime.SqlGroovyMethods"
+ category "org.codehaus.groovy.runtime.SwingGroovyMethods"
+ category "org.codehaus.groovy.runtime.XmlGroovyMethods"
+}
diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml
index e2a75b4b8ec8..1cdd836911ea 100644
--- a/plugins/groovy/src/META-INF/plugin.xml
+++ b/plugins/groovy/src/META-INF/plugin.xml
@@ -61,6 +61,8 @@
+
+
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/CategoryMethodProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/CategoryMethodProvider.java
index 8efd1fe470db..bfac54afb614 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/CategoryMethodProvider.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/CategoryMethodProvider.java
@@ -24,6 +24,7 @@ import com.intellij.psi.util.*;
import com.intellij.util.Function;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil;
import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil;
import java.util.ArrayList;
@@ -43,7 +44,7 @@ public class CategoryMethodProvider {
public static List provideMethods(@NotNull PsiType psiType,
final Project project,
String className,
- GlobalSearchScope scope,
+ final GlobalSearchScope scope,
final Function converter) {
final PsiClass categoryClass = JavaPsiFacade.getInstance(project).findClass(className, scope);
if (categoryClass == null) return Collections.emptyList();
@@ -52,10 +53,11 @@ public class CategoryMethodProvider {
@Override
public Result> compute() {
MultiMap map = new MultiMap();
+ PsiManager manager = PsiManager.getInstance(project);
for (PsiMethod m : categoryClass.getMethods()) {
final PsiParameter[] params = m.getParameterList().getParameters();
if (params.length == 0) continue;
- final PsiType parameterType = params[0].getType();
+ final PsiType parameterType = TypesUtil.boxPrimitiveType(params[0].getType(), manager, scope);
PsiType targetType = TypeConversionUtil.erasure(parameterType);
map.putValue(targetType.getCanonicalText(), converter.fun(m));
}
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/GdslMetaClassProperties.groovy b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/GdslMetaClassProperties.groovy
index acf3d3bfa2c6..9a56fa3cf0d6 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/GdslMetaClassProperties.groovy
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/GdslMetaClassProperties.groovy
@@ -46,40 +46,6 @@ class GdslMetaClassProperties {
}
}
- Closure category = {Object[] params ->
- if (params.length == 1) {
- processCategoryMethods(params[0], new Function() {def fun(def param) {new GrGdkMethodImpl(param, false)}})
- }
- else if (params.length == 2) {
- if (params[1] instanceof Boolean) {
- processCategoryMethods(params[0], new Function() {def fun(def param) {new GrGdkMethodImpl(param, params[1])}})
- }
- else {
- processCategoryMethods(params[0], params[1])
- }
- }
- else throw new IllegalArgumentException("Incorrect aruments in method 'category': $params")
- }
-
- Closure gppCategory = {def className, def isStatic = false ->
- def staticConverter = new Function() {
- def fun(def m) {new GppGdkMethod(m, true)}
- };
- def nonStaticConverter = new Function() {
- def fun(def m) {new GppGdkMethod(m, false)}
- };
- category className, isStatic ? staticConverter : nonStaticConverter
- }
-
- private def processCategoryMethods (def className, Function converter) {
- contributor(context()) {
- if (!psiType) return;
- List methods = CategoryMethodProvider.provideMethods(psiType, project, className, resolveScope, converter)
- for (m in methods) add m
- }
- }
-
-
/**
* Auxiliary methods for context definition
*/
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppDslProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppDslProvider.java
new file mode 100644
index 000000000000..e57a222c25e6
--- /dev/null
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppDslProvider.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2000-2010 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jetbrains.plugins.groovy.gpp;
+
+import com.intellij.psi.PsiMethod;
+import com.intellij.util.Function;
+import org.jetbrains.plugins.groovy.dsl.GdslMembersHolderConsumer;
+import org.jetbrains.plugins.groovy.dsl.dsltop.GdslMembersProvider;
+import org.jetbrains.plugins.groovy.lang.resolve.GdkMethodDslProvider;
+
+/**
+ * @author Maxim.Medvedev
+ */
+@SuppressWarnings({"MethodMayBeStatic"})
+public class GppDslProvider implements GdslMembersProvider {
+ public void gppCategory(String className, GdslMembersHolderConsumer consumer) {
+ gppCategory(className, false, consumer);
+ }
+ public void gppCategory(String className, boolean isStatic, GdslMembersHolderConsumer consumer) {
+ Function staticConverter = new Function() {
+ public PsiMethod fun(PsiMethod m) {
+ return new GppGdkMethod(m, true);
+ }
+ };
+ Function nonStaticConverter = new Function() {
+ public PsiMethod fun(PsiMethod m) {
+ return new GppGdkMethod(m, false);
+ }
+ };
+ GdkMethodDslProvider.processCategoryMethods(className, consumer, isStatic ? staticConverter : nonStaticConverter);
+ }
+}
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/GdkMethodDslProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/GdkMethodDslProvider.java
new file mode 100644
index 000000000000..13a35df5ce47
--- /dev/null
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/GdkMethodDslProvider.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2000-2010 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jetbrains.plugins.groovy.lang.resolve;
+
+import com.intellij.psi.PsiMethod;
+import com.intellij.util.Function;
+import org.jetbrains.plugins.groovy.dsl.GdslMembersHolderConsumer;
+import org.jetbrains.plugins.groovy.dsl.dsltop.GdslMembersProvider;
+import org.jetbrains.plugins.groovy.dsl.holders.DelegatedMembersHolder;
+import org.jetbrains.plugins.groovy.dsl.toplevel.CategoryMethodProvider;
+import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrGdkMethodImpl;
+
+import java.util.List;
+
+/**
+ * @author Maxim.Medvedev
+ */
+@SuppressWarnings({"MethodMayBeStatic"})
+public class GdkMethodDslProvider implements GdslMembersProvider {
+ public void category(String className, GdslMembersHolderConsumer consumer) {
+ processCategoryMethods(className, consumer, new Function() {
+ public PsiMethod fun(PsiMethod m) {
+ return new GrGdkMethodImpl(m, false);
+ }
+ });
+ }
+
+ public void category(String className, final boolean isStatic, GdslMembersHolderConsumer consumer) {
+ processCategoryMethods(className, consumer, new Function() {
+ public PsiMethod fun(PsiMethod param) {
+ return new GrGdkMethodImpl(param, isStatic);
+ }
+ });
+ }
+
+ public void category(String className, Function converter, GdslMembersHolderConsumer consumer) {
+ processCategoryMethods(className, consumer, converter);
+ }
+
+ public static void processCategoryMethods(String className, GdslMembersHolderConsumer consumer, Function converter) {
+ if (consumer.getPsiType() == null) return;
+ List methods =
+ CategoryMethodProvider.provideMethods(consumer.getPsiType(), consumer.getProject(), className, consumer.getResolveScope(), converter);
+ final DelegatedMembersHolder holder = new DelegatedMembersHolder();
+ for (PsiMethod m : methods) {
+ holder.addMember(m);
+ }
+ consumer.addMemberHolder(holder);
+ }
+}
diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyDslTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyDslTest.groovy
index e57c7f4a2956..d8bd3e6b71b6 100644
--- a/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyDslTest.groovy
+++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyDslTest.groovy
@@ -131,7 +131,7 @@ public class MyCategory {
}""")
def foo = category.getMethods()[0]
final PsiFile file = myFixture.addFileToProject(getTestName(false) + "Enhancer.gdsl", """
-category 'MyCategory'""");
+contributor([:]){category 'MyCategory'}""");
GroovyDslFileIndex.activateUntilModification(file.virtualFile)
myFixture.renameElement foo, "bar", false, false