From 1a5d43b980e7c3797a868deae7a86646ea59a876 Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 7 Jul 2010 15:49:04 +0400 Subject: [PATCH] api corrected --- .../configurations/JavaParameters.java | 31 +++++++++++-------- .../openapi/roots/OrderEnumerator.java | 4 --- .../openapi/roots/OrderRootsEnumerator.java | 13 +++++++- .../roots/impl/OrderEnumeratorBase.java | 27 ---------------- .../roots/impl/OrderRootsEnumeratorImpl.java | 20 ++++++++++-- 5 files changed, 48 insertions(+), 47 deletions(-) diff --git a/java/execution/openapi/src/com/intellij/execution/configurations/JavaParameters.java b/java/execution/openapi/src/com/intellij/execution/configurations/JavaParameters.java index ab7cd6ab0cdf..194812adaf4c 100644 --- a/java/execution/openapi/src/com/intellij/execution/configurations/JavaParameters.java +++ b/java/execution/openapi/src/com/intellij/execution/configurations/JavaParameters.java @@ -24,7 +24,9 @@ import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.*; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.encoding.EncodingProjectManager; +import com.intellij.util.NotNullFunction; import com.intellij.util.PairFunction; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.nio.charset.Charset; @@ -65,20 +67,19 @@ public class JavaParameters extends SimpleJavaParameters { } setDefaultCharset(module.getProject()); - final PairFunction substitutor = computeSubstitutor(classPathType, jdk); - configureEnumerator(OrderEnumerator.orderEntries(module).runtimeOnly().recursively().substituteFiles(substitutor) - , classPathType).classes().collectPaths(getClassPath()); + configureEnumerator(OrderEnumerator.orderEntries(module).runtimeOnly().recursively(), classPathType, jdk).collectPaths(getClassPath()); } @Nullable - private static PairFunction computeSubstitutor(int classPathType, final Sdk jdk) { - return (classPathType & JDK_ONLY) == 0 ? null : new PairFunction() { - @Override - public VirtualFile[] fun(OrderEntry orderEntry, OrderRootType orderRootType) { + private static NotNullFunction computeRootProvider(int classPathType, final Sdk jdk) { + return (classPathType & JDK_ONLY) == 0 ? null : new NotNullFunction() { + @NotNull + @Override + public VirtualFile[] fun(OrderEntry orderEntry) { if (orderEntry instanceof JdkOrderEntry) { - return jdk.getRootProvider().getFiles(orderRootType); + return jdk.getRootProvider().getFiles(OrderRootType.CLASSES); } - return orderEntry.getFiles(orderRootType); + return orderEntry.getFiles(OrderRootType.CLASSES); } }; } @@ -117,17 +118,21 @@ public class JavaParameters extends SimpleJavaParameters { if ((classPathType & CLASSES_ONLY) == 0) { return; } - final PairFunction substitutor = computeSubstitutor(classPathType, jdk); - configureEnumerator(OrderEnumerator.orderEntries(project).runtimeOnly().substituteFiles(substitutor), classPathType).classes().collectPaths(getClassPath()); + configureEnumerator(OrderEnumerator.orderEntries(project).runtimeOnly(), classPathType, jdk).collectPaths(getClassPath()); } - private static OrderEnumerator configureEnumerator(OrderEnumerator enumerator, int classPathType) { + private static OrderRootsEnumerator configureEnumerator(OrderEnumerator enumerator, int classPathType, Sdk jdk) { if ((classPathType & JDK_ONLY) == 0) { enumerator = enumerator.withoutSdk(); } if ((classPathType & TESTS_ONLY) == 0) { enumerator = enumerator.productionOnly(); } - return enumerator; + OrderRootsEnumerator rootsEnumerator = enumerator.classes(); + final NotNullFunction provider = computeRootProvider(classPathType, jdk); + if (provider != null) { + rootsEnumerator = rootsEnumerator.usingCustomRootProvider(provider); + } + return rootsEnumerator; } } \ No newline at end of file diff --git a/platform/lang-api/src/com/intellij/openapi/roots/OrderEnumerator.java b/platform/lang-api/src/com/intellij/openapi/roots/OrderEnumerator.java index dffafbbab727..80e0c4fb8311 100644 --- a/platform/lang-api/src/com/intellij/openapi/roots/OrderEnumerator.java +++ b/platform/lang-api/src/com/intellij/openapi/roots/OrderEnumerator.java @@ -21,7 +21,6 @@ import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.ui.configuration.ModulesProvider; import com.intellij.openapi.util.Condition; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.PairFunction; import com.intellij.util.PathsList; import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; @@ -189,7 +188,4 @@ public abstract class OrderEnumerator { public static OrderEnumerator orderEntries(@NotNull Project project) { return ProjectRootManager.getInstance(project).orderEntries(); } - - public abstract OrderEnumerator substituteFiles(PairFunction substitutor); - public abstract OrderEnumerator substituteUrls(PairFunction substitutor); } diff --git a/platform/lang-api/src/com/intellij/openapi/roots/OrderRootsEnumerator.java b/platform/lang-api/src/com/intellij/openapi/roots/OrderRootsEnumerator.java index 5664b1ece922..cd3a21be4720 100644 --- a/platform/lang-api/src/com/intellij/openapi/roots/OrderRootsEnumerator.java +++ b/platform/lang-api/src/com/intellij/openapi/roots/OrderRootsEnumerator.java @@ -16,6 +16,7 @@ package com.intellij.openapi.roots; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.NotNullFunction; import com.intellij.util.PathsList; import org.jetbrains.annotations.NotNull; @@ -54,8 +55,18 @@ public interface OrderRootsEnumerator { /** * If roots for this enumerator are already evaluated the cached result will be used. Otherwise roots will be evaluated and cached for - * subsequent calls + * subsequent calls.

+ * Caching is not supported if {@link OrderEnumerator#satisfying}, {@link OrderEnumerator#using} or {@link #usingCustomRootProvider} + * option is used * @return this instance */ OrderRootsEnumerator usingCache(); + + /** + * Use provider to obtain roots of an library or jdk order entry instead of {@link OrderEntry#getFiles(OrderRootType)} method. Note that + * this option won't affect result of {@link #getUrls()} method + * @param provider function to evaluate roots for an order entry + * @return this instance + */ + OrderRootsEnumerator usingCustomRootProvider(@NotNull NotNullFunction provider); } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderEnumeratorBase.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderEnumeratorBase.java index 086ac8f2f68d..3fbfd6589f7c 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderEnumeratorBase.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderEnumeratorBase.java @@ -24,7 +24,6 @@ import com.intellij.openapi.roots.ui.configuration.ModulesProvider; import com.intellij.openapi.util.Condition; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; -import com.intellij.util.PairFunction; import com.intellij.util.Processor; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; @@ -52,8 +51,6 @@ abstract class OrderEnumeratorBase extends OrderEnumerator { private boolean myRecursivelyExportedOnly; private boolean myExportedOnly; private Condition myCondition; - private PairFunction myFileSubstitutor; - private PairFunction myUrlsSubstitutor; private List myCustomHandlers; private ModulesProvider myModulesProvider; private OrderRootsCache myCache; @@ -141,18 +138,6 @@ abstract class OrderEnumeratorBase extends OrderEnumerator { return this; } - @Override - public OrderEnumerator substituteFiles(PairFunction substitutor) { - myFileSubstitutor = substitutor; - return this; - } - - @Override - public OrderEnumerator substituteUrls(PairFunction substitutor) { - myUrlsSubstitutor = substitutor; - return this; - } - @Override public OrderRootsEnumerator classes() { return new OrderRootsEnumeratorImpl(this, OrderRootType.CLASSES); @@ -321,18 +306,6 @@ abstract class OrderEnumeratorBase extends OrderEnumerator { return false; } - @NotNull - public VirtualFile[] substituteFiles(OrderEntry orderEntry, OrderRootType rootType) { - if (myFileSubstitutor != null) return myFileSubstitutor.fun(orderEntry, rootType); - return orderEntry.getFiles(rootType); - } - - @NotNull - public String[] substituteUrls(OrderEntry orderEntry, OrderRootType rootType) { - if (myUrlsSubstitutor != null) return myUrlsSubstitutor.fun(orderEntry, rootType); - return orderEntry.getUrls(rootType); - } - private class OrderEntryProcessor implements Processor { private R myValue; private final RootPolicy myPolicy; diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderRootsEnumeratorImpl.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderRootsEnumeratorImpl.java index 7e1e08f94cc8..e5f162207402 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderRootsEnumeratorImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderRootsEnumeratorImpl.java @@ -15,11 +15,13 @@ */ package com.intellij.openapi.roots.impl; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.roots.*; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; +import com.intellij.util.NotNullFunction; import com.intellij.util.PathsList; import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; @@ -30,9 +32,11 @@ import java.util.*; * @author nik */ public class OrderRootsEnumeratorImpl implements OrderRootsEnumerator { + private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.roots.impl.OrderRootsEnumeratorImpl"); private final OrderEnumeratorBase myOrderEnumerator; private final OrderRootType myRootType; private boolean myUsingCache; + private NotNullFunction myCustomRootProvider; public OrderRootsEnumeratorImpl(OrderEnumeratorBase orderEnumerator, OrderRootType rootType) { myOrderEnumerator = orderEnumerator; @@ -43,6 +47,7 @@ public class OrderRootsEnumeratorImpl implements OrderRootsEnumerator { @Override public VirtualFile[] getRoots() { if (myUsingCache) { + checkCanUseCache(); final OrderRootsCache cache = myOrderEnumerator.getCache(); if (cache != null) { final int flags = myOrderEnumerator.getFlags(); @@ -63,6 +68,7 @@ public class OrderRootsEnumeratorImpl implements OrderRootsEnumerator { @Override public String[] getUrls() { if (myUsingCache) { + checkCanUseCache(); final OrderRootsCache cache = myOrderEnumerator.getCache(); if (cache != null) { final int flags = myOrderEnumerator.getFlags(); @@ -78,6 +84,10 @@ public class OrderRootsEnumeratorImpl implements OrderRootsEnumerator { return ArrayUtil.toStringArray(computeRootsUrls()); } + private void checkCanUseCache() { + LOG.assertTrue(myCustomRootProvider != null, "Caching not supported for OrderRootsEnumerator with 'usingCustomRootProvider' option"); + } + private Collection computeRoots() { final Collection result = new LinkedHashSet(); myOrderEnumerator.forEach(new Processor() { @@ -97,7 +107,7 @@ public class OrderRootsEnumeratorImpl implements OrderRootsEnumerator { } } else { - Collections.addAll(result, myOrderEnumerator.substituteFiles(orderEntry, myRootType)); + Collections.addAll(result, myCustomRootProvider != null ? myCustomRootProvider.fun(orderEntry) : orderEntry.getFiles(myRootType)); } return true; } @@ -124,7 +134,7 @@ public class OrderRootsEnumeratorImpl implements OrderRootsEnumerator { } } else { - Collections.addAll(result, myOrderEnumerator.substituteUrls(orderEntry, myRootType)); + Collections.addAll(result, orderEntry.getUrls(myRootType)); } return true; } @@ -151,6 +161,12 @@ public class OrderRootsEnumeratorImpl implements OrderRootsEnumerator { return this; } + @Override + public OrderRootsEnumerator usingCustomRootProvider(@NotNull NotNullFunction provider) { + myCustomRootProvider = provider; + return this; + } + private void collectModuleRoots(ModuleRootModel rootModel, Collection result) { if (myRootType.equals(OrderRootType.SOURCES)) { if (myOrderEnumerator.isProductionOnly()) {