From 165469678e25b07c6e9bbb62356337397d7f16ce Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 25 Oct 2012 17:24:15 +0400 Subject: [PATCH] class assertion --- .../extensions/impl/ExtensionPointImpl.java | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java index a3489c92c53c..cc7b6442d2d3 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java @@ -110,6 +110,9 @@ public class ExtensionPointImpl implements ExtensionPoint { public synchronized void registerExtension(@NotNull T extension, @NotNull LoadingOrder order) { assert myExtensions.size() == myLoadedAdapters.size(); + ObjectComponentAdapter adapter = new ObjectComponentAdapter(extension, order); + assertClass(extension.getClass()); + if (LoadingOrder.ANY == order) { int index = myLoadedAdapters.size(); if (index > 0) { @@ -118,10 +121,10 @@ public class ExtensionPointImpl implements ExtensionPoint { index--; } } - internalRegisterExtension(extension, new ObjectComponentAdapter(extension, order), index, true); + internalRegisterExtension(extension, adapter, index, true); } else { - myExtensionAdapters.add(new ObjectComponentAdapter(extension, order)); + myExtensionAdapters.add(adapter); processAdapters(); } clearCache(); @@ -177,10 +180,10 @@ public class ExtensionPointImpl implements ExtensionPoint { T t = result[i]; if (i > 0 && result[i] == result[i - 1]) { LOG.error("Duplicate extension found: " + t + "; " + - " Result: "+ Arrays.asList(result)+";\n" + - " extensions: "+ myExtensions+";\n" + - " getExtensionClass(): "+ extensionClass +";\n" + - " size:"+myExtensions.size()+";"+result.length); + " Result: " + Arrays.asList(result) + ";\n" + + " extensions: " + myExtensions + ";\n" + + " getExtensionClass(): " + extensionClass + ";\n" + + " size:" + myExtensions.size() + ";" + result.length); } if (!extensionClass.isAssignableFrom(t.getClass())) { @@ -216,13 +219,17 @@ public class ExtensionPointImpl implements ExtensionPoint { allAdapters.addAll(myLoadedAdapters); myExtensions.clear(); - ExtensionComponentAdapter[] loadedAdapters = myLoadedAdapters.isEmpty() ? ExtensionComponentAdapter.EMPTY_ARRAY : myLoadedAdapters.toArray(new ExtensionComponentAdapter[myLoadedAdapters.size()]); + ExtensionComponentAdapter[] loadedAdapters = myLoadedAdapters.isEmpty() + ? ExtensionComponentAdapter.EMPTY_ARRAY + : myLoadedAdapters.toArray(new ExtensionComponentAdapter[myLoadedAdapters.size()]); myLoadedAdapters.clear(); ExtensionComponentAdapter[] adapters = allAdapters.toArray(new ExtensionComponentAdapter[myExtensionAdapters.size()]); LoadingOrder.sort(adapters); for (ExtensionComponentAdapter adapter : adapters) { //noinspection unchecked T extension = (T)adapter.getExtension(); + assertClass(extension.getClass()); + internalRegisterExtension(extension, adapter, myExtensions.size(), ArrayUtil.find(loadedAdapters, adapter) == -1); } myExtensionAdapters.clear(); @@ -318,7 +325,8 @@ public class ExtensionPointImpl implements ExtensionPoint { try { //noinspection unchecked listener.extensionAdded((T)componentAdapter.getExtension(), componentAdapter.getPluginDescriptor()); - } catch (Throwable e) { + } + catch (Throwable e) { myLogger.error(e); } } @@ -375,11 +383,16 @@ public class ExtensionPointImpl implements ExtensionPoint { return getName(); } - synchronized void registerExtensionAdapter(ExtensionComponentAdapter adapter) { + synchronized void registerExtensionAdapter(@NotNull ExtensionComponentAdapter adapter) { myExtensionAdapters.add(adapter); clearCache(); } + private void assertClass(@NotNull Class extensionClass) { + Class expectedClass = getExtensionClass(); + assert expectedClass.isAssignableFrom(extensionClass) : "Expected: "+ expectedClass +"; Actual: "+ extensionClass; + } + private void clearCache() { myExtensionsCache = null; } @@ -421,7 +434,7 @@ public class ExtensionPointImpl implements ExtensionPoint { private final Object myExtension; private final LoadingOrder myLoadingOrder; - private ObjectComponentAdapter(Object extension, LoadingOrder loadingOrder) { + private ObjectComponentAdapter(@NotNull Object extension, @NotNull LoadingOrder loadingOrder) { super(Object.class.getName(), null, null, null, false); myExtension = extension; myLoadingOrder = loadingOrder;