From d8763b414bf5aecbdf3c4c1e47cdd38850bbc1ad Mon Sep 17 00:00:00 2001 From: Maxim Medvedev Date: Sun, 8 Aug 2010 17:11:50 +0400 Subject: [PATCH] filters for groovy categories in Gdsl --- .../resources/standardDsls/GppExtensions.gdsl | 26 ++++---- .../resources/standardDsls/extensions.gdsl | 18 +++--- plugins/groovy/src/META-INF/plugin.xml | 2 + .../dsl/toplevel/CategoryMethodProvider.java | 6 +- .../toplevel/GdslMetaClassProperties.groovy | 34 ---------- .../plugins/groovy/gpp/GppDslProvider.java | 45 +++++++++++++ .../lang/resolve/GdkMethodDslProvider.java | 63 +++++++++++++++++++ .../plugins/groovy/dsl/GroovyDslTest.groovy | 2 +- 8 files changed, 138 insertions(+), 58 deletions(-) create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppDslProvider.java create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/GdkMethodDslProvider.java 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