Copyright (c) 2017 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/ SPDX-License-Identifier: EPL-2.0 Contributors: IBM Corporation - initial API and implementation
/******************************************************************************* * Copyright (c) 2017 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * 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 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); } }