api corrected

This commit is contained in:
nik
2010-07-07 16:08:20 +04:00
parent 49b9b10fc7
commit 1a5d43b980
5 changed files with 48 additions and 47 deletions
@@ -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<OrderEntry, OrderRootType, VirtualFile[]> 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<OrderEntry, OrderRootType, VirtualFile[]> computeSubstitutor(int classPathType, final Sdk jdk) {
return (classPathType & JDK_ONLY) == 0 ? null : new PairFunction<OrderEntry, OrderRootType, VirtualFile[]>() {
@Override
public VirtualFile[] fun(OrderEntry orderEntry, OrderRootType orderRootType) {
private static NotNullFunction<OrderEntry, VirtualFile[]> computeRootProvider(int classPathType, final Sdk jdk) {
return (classPathType & JDK_ONLY) == 0 ? null : new NotNullFunction<OrderEntry, VirtualFile[]>() {
@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<OrderEntry, OrderRootType, VirtualFile[]> 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<OrderEntry, VirtualFile[]> provider = computeRootProvider(classPathType, jdk);
if (provider != null) {
rootsEnumerator = rootsEnumerator.usingCustomRootProvider(provider);
}
return rootsEnumerator;
}
}
@@ -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<OrderEntry, OrderRootType, VirtualFile[]> substitutor);
public abstract OrderEnumerator substituteUrls(PairFunction<OrderEntry, OrderRootType, String[]> substitutor);
}
@@ -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. <p>
* Caching is not supported if {@link OrderEnumerator#satisfying}, {@link OrderEnumerator#using} or {@link #usingCustomRootProvider}
* option is used
* @return this instance
*/
OrderRootsEnumerator usingCache();
/**
* Use <code>provider</code> 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<OrderEntry, VirtualFile[]> provider);
}
@@ -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<OrderEntry> myCondition;
private PairFunction<OrderEntry, OrderRootType, VirtualFile[]> myFileSubstitutor;
private PairFunction<OrderEntry, OrderRootType, String[]> myUrlsSubstitutor;
private List<OrderEnumerationHandler> myCustomHandlers;
private ModulesProvider myModulesProvider;
private OrderRootsCache myCache;
@@ -141,18 +138,6 @@ abstract class OrderEnumeratorBase extends OrderEnumerator {
return this;
}
@Override
public OrderEnumerator substituteFiles(PairFunction<OrderEntry, OrderRootType, VirtualFile[]> substitutor) {
myFileSubstitutor = substitutor;
return this;
}
@Override
public OrderEnumerator substituteUrls(PairFunction<OrderEntry, OrderRootType, String[]> 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<R> implements Processor<OrderEntry> {
private R myValue;
private final RootPolicy<R> myPolicy;
@@ -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<OrderEntry, VirtualFile[]> 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<VirtualFile> computeRoots() {
final Collection<VirtualFile> result = new LinkedHashSet<VirtualFile>();
myOrderEnumerator.forEach(new Processor<OrderEntry>() {
@@ -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<OrderEntry, VirtualFile[]> provider) {
myCustomRootProvider = provider;
return this;
}
private void collectModuleRoots(ModuleRootModel rootModel, Collection<VirtualFile> result) {
if (myRootType.equals(OrderRootType.SOURCES)) {
if (myOrderEnumerator.isProductionOnly()) {