Search in sources :

Example 1 with Usage

use of org.eclipse.ceylon.cmr.ceylon.ClassFileScanner.Usage in project ceylon by eclipse.

the class LegacyImporter method checkDependencies.

private void checkDependencies(TreeSet<ModuleDependencyInfo> sortedDeps, Set<String> visited, boolean exported) throws Exception {
    for (ModuleDependencyInfo dep : sortedDeps) {
        // only do exported, or non-exported
        if (exported != dep.isExport())
            continue;
        // skip test scope
        if (dep.getModuleScope() == ModuleScope.TEST)
            continue;
        // skip already-visited dependencies based on name/version key
        if (!visited.add(dep.getModuleName()))
            continue;
        feedback.beforeDependency(dep);
        String name = dep.getName();
        String version = dep.getVersion();
        // missing dep is OK, it can be fixed later, but invalid module/dependency is not OK
        if (name == null || name.isEmpty())
            feedback.dependencyError(DependencyErrors.DEPERR_INVALID_MODULE_NAME, dep);
        if (ModuleUtil.isDefaultModule(name))
            feedback.dependencyError(DependencyErrors.DEPERR_INVALID_MODULE_DEFAULT, dep);
        if (version == null || version.isEmpty())
            feedback.dependencyError(DependencyErrors.DEPERR_INVALID_MODULE_VERSION, dep);
        Usage usage = null;
        if (jdkProvider.isJDKModule(name)) {
            usage = scanner.removeMatchingJdkClasses(name);
        } else {
            ArtifactContext context = new ArtifactContext(dep.getNamespace(), name, version, ArtifactContext.CAR, ArtifactContext.JAR);
            ArtifactResult result = lookupRepoman.getArtifactResult(context);
            File artifact = result != null ? result.artifact() : null;
            if (artifact != null && artifact.exists()) {
                try {
                    Set<String> importedClasses = JarUtils.gatherClassnamesFromJar(artifact);
                    addTransitiveDependenciesClasses(result, importedClasses, visited, dep);
                    usage = scanner.removeMatchingClasses(importedClasses);
                } catch (IOException e) {
                    feedback.dependency(DependencyResults.DEP_CHECK_FAILED, dep);
                    hasErrors = true;
                }
            } else {
                if (dep.isOptional()) {
                    String key = ModuleUtil.makeModuleName(dep.getName(), dep.getVersion());
                    if (missingDependenciesPackages != null && missingDependenciesPackages.containsKey(key)) {
                        List<Pattern> packages = missingDependenciesPackages.get(key);
                        usage = scanner.removeMatchingPackages(packages);
                    }
                }
                if (usage == null) {
                    feedback.dependency(DependencyResults.DEP_NOT_FOUND, dep);
                    hasErrors = true;
                }
            }
        }
        if (usage != null) {
            switch(usage) {
                case Used:
                    if (!dep.isExport()) {
                        feedback.dependency(DependencyResults.DEP_OK, dep);
                    } else {
                        dep = new ModuleDependencyInfo(null, dep.getName(), dep.getVersion(), dep.isOptional(), false, dep.getNativeBackends(), dep.getModuleScope());
                        feedback.dependency(DependencyResults.DEP_MARK_UNSHARED, dep);
                    }
                    break;
                case UsedInPublicApi:
                    if (dep.isExport()) {
                        feedback.dependency(DependencyResults.DEP_OK, dep);
                    } else {
                        dep = new ModuleDependencyInfo(null, dep.getName(), dep.getVersion(), dep.isOptional(), true, dep.getNativeBackends(), dep.getModuleScope());
                        feedback.dependency(DependencyResults.DEP_MARK_SHARED, dep);
                        hasProblems = true;
                    }
                    break;
                default:
                    // not used at all
                    dep = new ModuleDependencyInfo(null, dep.getName(), dep.getVersion(), dep.isOptional(), false, dep.getNativeBackends(), dep.getModuleScope());
                    feedback.dependency(DependencyResults.DEP_OK_UNUSED, dep);
            }
        }
        feedback.afterDependency(dep);
        expectedDependencies.add(dep);
    }
}
Also used : Pattern(java.util.regex.Pattern) Usage(org.eclipse.ceylon.cmr.ceylon.ClassFileScanner.Usage) ModuleDependencyInfo(org.eclipse.ceylon.cmr.api.ModuleDependencyInfo) ArtifactContext(org.eclipse.ceylon.cmr.api.ArtifactContext) IOException(java.io.IOException) File(java.io.File) ArtifactResult(org.eclipse.ceylon.model.cmr.ArtifactResult)

Aggregations

File (java.io.File)1 IOException (java.io.IOException)1 Pattern (java.util.regex.Pattern)1 ArtifactContext (org.eclipse.ceylon.cmr.api.ArtifactContext)1 ModuleDependencyInfo (org.eclipse.ceylon.cmr.api.ModuleDependencyInfo)1 Usage (org.eclipse.ceylon.cmr.ceylon.ClassFileScanner.Usage)1 ArtifactResult (org.eclipse.ceylon.model.cmr.ArtifactResult)1