diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodDescriptor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodDescriptor.java index d2b2b2338f1a..eae55b709bd7 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodDescriptor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodDescriptor.java @@ -1,21 +1,19 @@ package org.jetbrains.plugins.groovy.extensions; +import com.intellij.openapi.extensions.AbstractExtensionPointBean; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.PsiMethod; import com.intellij.util.xmlb.annotations.AbstractCollection; import com.intellij.util.xmlb.annotations.Attribute; import com.intellij.util.xmlb.annotations.Property; import com.intellij.util.xmlb.annotations.Tag; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall; import java.util.*; /** * @author Sergey Evdokimov */ -public class GroovyMethodDescriptor { +public class GroovyMethodDescriptor extends AbstractExtensionPointBean { private static final String ATTR_NAMES_DELIMITER = " \t\n\r,;"; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodInfo.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodInfo.java index 2e6f829b7f10..c691f51215ef 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodInfo.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodInfo.java @@ -21,7 +21,8 @@ public class GroovyMethodInfo { private static Map>> LIGHT_METHOD_INFOS; private final List myParams; - + private final ClassLoader myClassLoader; + private final String myReturnType; private final String myReturnTypeCalculatorClassName; private PairFunction myReturnTypeCalculatorInstance; @@ -121,6 +122,7 @@ public class GroovyMethodInfo { } public GroovyMethodInfo(GroovyMethodDescriptor method) { + myClassLoader = method.getLoaderForClass(); myParams = method.getParams(); myReturnType = method.returnType; myReturnTypeCalculatorClassName = method.returnTypeCalculator; @@ -177,7 +179,7 @@ public class GroovyMethodInfo { @NotNull public PairFunction getReturnTypeCalculator() { if (myReturnTypeCalculatorInstance == null) { - myReturnTypeCalculatorInstance = ClassInstanceCache.getInstance(myReturnTypeCalculatorClassName); + myReturnTypeCalculatorInstance = ClassInstanceCache.getInstance(myReturnTypeCalculatorClassName, myClassLoader); } return myReturnTypeCalculatorInstance; } @@ -193,7 +195,7 @@ public class GroovyMethodInfo { public GroovyNamedArgumentProvider getNamedArgProvider() { if (myNamedArgProviderInstance == null) { - myNamedArgProviderInstance = ClassInstanceCache.getInstance(myNamedArgProviderClassName); + myNamedArgProviderInstance = ClassInstanceCache.getInstance(myNamedArgProviderClassName, myClassLoader); } return myNamedArgProviderInstance; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/util/ClassInstanceCache.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/util/ClassInstanceCache.java index bf536189f4b1..7a9f0554e661 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/util/ClassInstanceCache.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/util/ClassInstanceCache.java @@ -1,7 +1,5 @@ package org.jetbrains.plugins.groovy.util; -import com.intellij.ide.plugins.IdeaPluginDescriptor; -import com.intellij.ide.plugins.PluginManager; import com.intellij.util.containers.ConcurrentHashMap; import org.jetbrains.annotations.NotNull; @@ -15,34 +13,16 @@ public class ClassInstanceCache { private ClassInstanceCache() { } - private static Object createInstance(@NotNull String className) { - try { - try { - return Class.forName(className).newInstance(); - } - catch (ClassNotFoundException e) { - for (IdeaPluginDescriptor descriptor : PluginManager.getPlugins()) { - try { - return descriptor.getPluginClassLoader().loadClass(className).newInstance(); - } - catch (ClassNotFoundException ignored) { - - } - } - - throw new RuntimeException("Class not found: " + className); - } - } - catch (Exception e) { - throw new RuntimeException(e); - } - } - @SuppressWarnings("unchecked") - public static T getInstance(@NotNull String className) { + public static T getInstance(@NotNull String className, ClassLoader classLoader) { Object res = CACHE.get(className); if (res == null) { - res = createInstance(className); + try { + res = classLoader.loadClass(className).newInstance(); + } + catch (Exception e) { + throw new RuntimeException(e); + } Object oldValue = CACHE.putIfAbsent(className, res); if (oldValue != null) { @@ -52,5 +32,4 @@ public class ClassInstanceCache { return (T)res; } - }