Java tutorial
/******************************************************************************* * Copyright (c) 2017, 2019 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.core; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IModuleDescription; import org.eclipse.jdt.core.ITypeRoot; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.env.IModule; import org.eclipse.jdt.internal.compiler.env.IModule.IModuleReference; import org.eclipse.jdt.internal.compiler.env.IModule.IPackageExport; import org.eclipse.jdt.internal.compiler.env.IModule.IService; public interface AbstractModule extends IModuleDescription { /** * Handle for an automatic module. * * <p>Note, that by definition this is mostly a fake, only {@link #getElementName()} provides a useful value.</p> */ static class AutoModule extends NamedMember implements AbstractModule { private boolean nameFromManifest; public AutoModule(JavaElement parent, String name, boolean nameFromManifest) { super(parent, name); this.nameFromManifest = nameFromManifest; } @Override public IJavaElement[] getChildren() throws JavaModelException { return JavaElement.NO_ELEMENTS; // may later answer computed details } @Override public int getFlags() throws JavaModelException { return 0; } @Override public boolean isAutoModule() { return true; } public boolean isAutoNameFromManifest() { return this.nameFromManifest; } @Override public char getHandleMementoDelimiter() { return JavaElement.JEM_MODULE; } @Override public ITypeRoot getTypeRoot() { return null; // has no real CompilationUnit nor ClassFile } @Override public IModuleReference[] getRequiredModules() throws JavaModelException { return ModuleDescriptionInfo.NO_REQUIRES; } @Override public void toStringContent(StringBuffer buffer, String lineDelimiter) throws JavaModelException { buffer.append("automatic module "); //$NON-NLS-1$ buffer.append(this.name); } } // "forward declaration" for a method from JavaElement: abstract Object getElementInfo() throws JavaModelException; default IModule getModuleInfo() throws JavaModelException { return (IModule) getElementInfo(); } @Override default String[] getExportedPackageNames(IModuleDescription targetModule) throws JavaModelException { IModule info = getModuleInfo(); if (info != null) { List<String> result = new ArrayList<>(); for (IPackageExport packageExport : info.exports()) { if (targetModule == null || !packageExport.isQualified() || CharOperation .containsEqual(packageExport.targets(), targetModule.getElementName().toCharArray())) { result.add(new String(packageExport.name())); } } return result.toArray(new String[result.size()]); } return new String[0]; } @Override default String[] getOpenedPackageNames(IModuleDescription targetModule) throws JavaModelException { IModule info = getModuleInfo(); if (info != null) { List<String> result = new ArrayList<>(); for (IPackageExport packageOpen : info.opens()) { if (targetModule == null || !packageOpen.isQualified() || CharOperation .containsEqual(packageOpen.targets(), targetModule.getElementName().toCharArray())) { result.add(new String(packageOpen.name())); } } return result.toArray(new String[result.size()]); } return new String[0]; } default IModuleReference[] getRequiredModules() throws JavaModelException { return getModuleInfo().requires(); } default IPackageExport[] getExportedPackages() throws JavaModelException { return getModuleInfo().exports(); } default IService[] getProvidedServices() throws JavaModelException { return getModuleInfo().provides(); } @Override default String[] getProvidedServiceNames() throws JavaModelException { ArrayList<String> results = new ArrayList<>(); IService[] services = getProvidedServices(); for (IService service : services) { results.add(new String(service.name())); } return results.toArray(new String[0]); } default char[][] getUsedServices() throws JavaModelException { return getModuleInfo().uses(); } @Override default String[] getUsedServiceNames() throws JavaModelException { ArrayList<String> results = new ArrayList<>(); char[][] services = getUsedServices(); for (int i = 0; i < services.length; ++i) { char[] service = services[i]; results.add(new String(service)); } return results.toArray(new String[0]); } default IPackageExport[] getOpenedPackages() throws JavaModelException { return getModuleInfo().opens(); } @Override default String[] getRequiredModuleNames() throws JavaModelException { IModuleReference[] references = getRequiredModules(); return Arrays.stream(references).map(ref -> String.valueOf(ref.name())).toArray(String[]::new); } default String toString(String lineDelimiter) { StringBuffer buffer = new StringBuffer(); try { toStringContent(buffer, lineDelimiter); } catch (JavaModelException e) { // TODO Auto-generated catch block e.printStackTrace(); } return buffer.toString(); } default void toStringContent(StringBuffer buffer, String lineDelimiter) throws JavaModelException { IPackageExport[] exports = getExportedPackages(); IModuleReference[] requires = getRequiredModules(); buffer.append("module "); //$NON-NLS-1$ buffer.append(getElementName()).append(' '); buffer.append('{').append(lineDelimiter); if (exports != null) { for (int i = 0; i < exports.length; i++) { buffer.append("\texports "); //$NON-NLS-1$ buffer.append(exports[i].toString()); buffer.append(lineDelimiter); } } buffer.append(lineDelimiter); if (requires != null) { for (int i = 0; i < requires.length; i++) { buffer.append("\trequires "); //$NON-NLS-1$ if (requires[i].isTransitive()) { buffer.append(" public "); //$NON-NLS-1$ } buffer.append(requires[i].name()); buffer.append(';').append(lineDelimiter); } } buffer.append(lineDelimiter).append('}').toString(); } @Override default int getElementType() { return JAVA_MODULE; } }