All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.gwt.dev.javac.CompilationUnitInvalidator Maven / Gradle / Ivy

There is a newer version: 2.10.0
Show newest version
/*
 * Copyright 2008 Google Inc.
 * 
 * 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 com.google.gwt.dev.javac;

import com.google.gwt.core.ext.TreeLogger;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

/**
 * Helper class to invalidate units in a set based on errors or references to
 * other invalidate units.
 */
public class CompilationUnitInvalidator {

  public static void retainValidUnits(TreeLogger logger,
      Collection units, Map validClasses) {
    logger = logger.branch(TreeLogger.TRACE, "Removing invalidated units");

    // Assume all units are valid at first.
    Set currentlyValidUnits = new LinkedHashSet();
    Set currentlyValidClasses = new HashSet();
    for (CompilationUnit unit : units) {
      if (!unit.isError()) {
        currentlyValidUnits.add(unit);
        for (CompiledClass cc : unit.getCompiledClasses()) {
          currentlyValidClasses.add(cc.getSourceName());
        }
      }
    }
    for (Entry entry : validClasses.entrySet()) {
      if (!entry.getValue().getUnit().isError()) {
        currentlyValidClasses.add(entry.getKey());
      }
    }

    boolean changed;
    do {
      changed = false;
      for (Iterator it = currentlyValidUnits.iterator(); it.hasNext();) {
        CompilationUnit unitToCheck = it.next();
        List invalidRefs = unitToCheck.getDependencies().findMissingApiRefs(
            currentlyValidClasses);
        if (invalidRefs.size() > 0) {
          it.remove();
          for (CompiledClass cc : unitToCheck.getCompiledClasses()) {
            currentlyValidClasses.remove(cc.getSourceName());
          }
          changed = true;
          TreeLogger branch = logger.branch(TreeLogger.DEBUG,
              "Compilation unit '" + unitToCheck
                  + "' is removed due to invalid reference(s):");
          for (String ref : invalidRefs) {
            branch.log(TreeLogger.DEBUG, ref);
          }
        }
      }
    } while (changed);

    units.retainAll(currentlyValidUnits);
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy