blob: 4ea429eadfddfe868d8d8dd3fa8afd2bc86a7f38 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.compiler.env;
import java.util.jar.Manifest;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
public interface IModule {
public static IModuleReference[] NO_MODULE_REFS = new IModuleReference[0];
public static IPackageExport[] NO_EXPORTS = new IPackageExport[0];
public static char[][] NO_USES = new char[0][];
public static IService[] NO_PROVIDES = new IService[0];
public static IModule[] NO_MODULES = new IModule[0];
public static IPackageExport[] NO_OPENS = new IPackageExport[0];
public String MODULE_INFO = "module-info"; //$NON-NLS-1$
public String MODULE_INFO_JAVA = "module-info.java"; //$NON-NLS-1$
public String MODULE_INFO_CLASS = "module-info.class"; //$NON-NLS-1$
public char[] name();
public IModuleReference[] requires();
public IPackageExport[] exports();
public char[][] uses();
public IService[] provides();
/*
* the opens package statement is very similar to package export statement, hence
* the same internal models are being used here.
*/
public IPackageExport[] opens();
public interface IModuleReference {
public char[] name();
public default boolean isTransitive() {
return (getModifiers() & ClassFileConstants.ACC_TRANSITIVE) != 0;
}
public int getModifiers();
public default boolean isStatic() {
return (getModifiers() & ClassFileConstants.ACC_STATIC_PHASE) != 0;
}
}
public interface IPackageExport {
public char[] name();
public char[][] targets();
public default boolean isQualified() {
char[][] targets = targets();
return targets != null && targets.length > 0;
}
}
public interface IService {
public char[] name();
char[][] with();
}
public default void addReads(char[] modName) {
// do nothing, would throwing an exception be better?
}
public default void addExports(IPackageExport[] exports) {
// do nothing, would throwing an exception be better?
}
public default boolean isAutomatic() {
return false;
}
public default boolean isAutoNameFromManifest() {
return false;
}
public abstract boolean isOpen();
public static IModule createAutomatic(char[] moduleName, boolean fromManifest) {
final class AutoModule implements IModule {
char[] name;
boolean nameFromManifest;
public AutoModule(char[] name, boolean nameFromManifest) {
this.name = name;
this.nameFromManifest = nameFromManifest;
}
@Override
public char[] name() {
return this.name;
}
@Override
public IModuleReference[] requires() {
return IModule.NO_MODULE_REFS;
}
@Override
public IPackageExport[] exports() {
return IModule.NO_EXPORTS;
}
@Override
public char[][] uses() {
return IModule.NO_USES;
}
@Override
public IService[] provides() {
return IModule.NO_PROVIDES;
}
@Override
public IPackageExport[] opens() {
return NO_OPENS;
}
@Override
public boolean isAutomatic() {
return true;
}
@Override
public boolean isAutoNameFromManifest() {
return this.nameFromManifest;
}
@Override
public boolean isOpen() {
return false;
}
}
return new AutoModule(moduleName, fromManifest);
}
public static IModule createAutomatic(String fileName, boolean isFile, Manifest manifest) {
boolean fromManifest = true;
char[] inferredName = AutomaticModuleNaming.determineAutomaticModuleNameFromManifest(manifest);
if (inferredName == null) {
fromManifest = false;
inferredName = AutomaticModuleNaming.determineAutomaticModuleNameFromFileName(fileName, true, isFile);
}
return createAutomatic(inferredName, fromManifest);
}
}