/* * Copyright 2013 the original author or authors. * * 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.gradle.api.internal.tasks.compile.incremental.deps; import com.google.common.collect.Sets; import java.util.HashSet; import java.util.Set; public class ClassSetAnalysis { private final ClassSetAnalysisData data; public ClassSetAnalysis(ClassSetAnalysisData data) { this.data = data; } public DependentsSet getRelevantDependents(Iterable<String> classes, Set<Integer> constants) { Set<String> result = null; for (String cls : classes) { DependentsSet d = getRelevantDependents(cls, constants); if (d.isDependencyToAll()) { return d; } Set<String> dependentClasses = d.getDependentClasses(); if (dependentClasses.isEmpty()) { continue; } if (result == null) { result = Sets.newLinkedHashSet(); } for (String dependentClass : dependentClasses) { result.add(dependentClass); Set<String> children = data.classesToChildren.get(dependentClass); if (children != null && children.contains(cls)) { System.out.println("children = " + children); } } result.addAll(dependentClasses); } return result == null ? DefaultDependentsSet.EMPTY : new DefaultDependentsSet(result); } public DependentsSet getRelevantDependents(String className, Set<Integer> constants) { DependentsSet deps = data.getDependents(className); if (deps != null && deps.isDependencyToAll()) { return deps; } if (deps == null && constants.isEmpty()) { return DefaultDependentsSet.EMPTY; } if (!constants.isEmpty()) { return DependencyToAll.INSTANCE; } Set<String> result = new HashSet<String>(); if (deps != null && !deps.isDependencyToAll()) { recurseDependents(new HashSet<String>(), result, deps.getDependentClasses()); } result.remove(className); return new DefaultDependentsSet(result); } public boolean isDependencyToAll(String className) { DependentsSet deps = data.getDependents(className); return deps != null && deps.isDependencyToAll(); } private void recurseDependents(Set<String> visited, Set<String> result, Set<String> dependentClasses) { for (String d : dependentClasses) { if (!visited.add(d)) { continue; } if (!d.contains("$")) { //filter out the inner classes result.add(d); } DependentsSet currentDependents = data.getDependents(d); if (currentDependents != null && !currentDependents.isDependencyToAll()) { recurseDependents(visited, result, currentDependents.getDependentClasses()); } } } public ClassSetAnalysisData getData() { return data; } }