/******************************************************************************* * Copyright (c) 2000, 2016 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.dltk.internal.core; import java.util.List; import org.eclipse.dltk.core.IImportContainer; import org.eclipse.dltk.core.IImportDeclaration; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.ISourceRange; import org.eclipse.dltk.core.ISourceReference; import org.eclipse.dltk.core.ModelException; import org.eclipse.dltk.core.SourceRange; import org.eclipse.dltk.core.WorkingCopyOwner; import org.eclipse.dltk.internal.core.util.MementoTokenizer; import org.eclipse.dltk.utils.CorePrinter; /** * @see IImportContainer */ public class ImportContainer extends SourceRefElement implements IImportContainer { private final String containerName; protected ImportContainer(AbstractSourceModule parent, String containerName) { super(parent); this.containerName = containerName; } @Override public String getContainerName() { return containerName; } @Override public String getElementName() { return getContainerName(); } @Override public boolean equals(Object o) { if (!(o instanceof ImportContainer)) return false; final ImportContainer other = (ImportContainer) o; if (!containerName.equals(other.containerName)) { return false; } return super.equals(o); } /** * @see IJavaElement */ @Override public int getElementType() { return IMPORT_CONTAINER; } @Override public IModelElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner workingCopyOwner) { switch (token.charAt(0)) { case JEM_COUNT: return getHandleUpdatingCountFromMemento(memento, workingCopyOwner); case JEM_IMPORTDECLARATION: if (memento.hasMoreTokens()) { String importName = memento.nextToken(); String version = memento.nextToken(); String alias = memento.nextToken(); int type = Integer.parseInt(memento.nextToken()); int flags = Integer.parseInt(memento.nextToken()); if (version.length() == 0) { version = null; } ModelElement importDecl = (ModelElement) getImport(importName, version, alias, type, flags); return importDecl.getHandleFromMemento(memento, workingCopyOwner); } else { return this; } } return null; } /** * @see ModelElement#getHandleMemento() */ @Override protected char getHandleMementoDelimiter() { return ModelElement.JEM_IMPORTDECLARATION; } /** * @see IImportContainer */ @Override public IImportDeclaration getImport(String importName, String version) { return new ImportDeclaration(this, importName, version); } /** * @see IImportContainer * @since 5.2 */ @Override public IImportDeclaration getImport(String importName, String version, String alias, int type, int flags) { return new ImportDeclaration(this, importName, version, alias, type, flags); } @Override public IImportDeclaration[] getImports() throws ModelException { List<IModelElement> list = getChildrenOfType(IMPORT_DECLARATION); return list.toArray(new IImportDeclaration[list.size()]); } /* * @see JavaElement#getPrimaryElement(boolean) */ @Override public IModelElement getPrimaryElement(boolean checkOwner) { AbstractSourceModule cu = (AbstractSourceModule) this.parent; if (checkOwner && cu.isPrimary()) return this; return new ImportContainer(cu, containerName); } /** * @see ISourceReference */ @Override public ISourceRange getSourceRange() throws ModelException { IModelElement[] imports = getChildren(); if (imports.length != 0) { ISourceRange firstRange = ((ISourceReference) imports[0]) .getSourceRange(); ISourceRange lastRange = ((ISourceReference) imports[imports.length - 1]) .getSourceRange(); return new SourceRange(firstRange.getOffset(), lastRange.getOffset() + lastRange.getLength() - firstRange.getOffset()); } else { return null; } } /** * @private Debugging purposes */ @Override protected void toString(int tab, StringBuffer buffer) { Object info = ModelManager.getModelManager().peekAtInfo(this); if (info == null || !(info instanceof ModelElementInfo)) return; IModelElement[] children = ((ModelElementInfo) info).getChildren(); for (int i = 0; i < children.length; i++) { if (i > 0) buffer.append("\n"); //$NON-NLS-1$ ((ModelElement) children[i]).toString(tab, buffer); } } /** * Debugging purposes */ @Override protected void toStringInfo(int tab, StringBuffer buffer, Object info, boolean showResolvedInfo) { buffer.append(tabString(tab)); buffer.append("<import container>"); //$NON-NLS-1$ if (info == null) { buffer.append(" (not open)"); //$NON-NLS-1$ } } @Override protected void closing(Object info) throws ModelException { // NOP } @Override public void printNode(CorePrinter output) { output.formatPrint("<import container>" + getElementName()); //$NON-NLS-1$ output.indent(); try { IModelElement[] modelElements = this.getChildren(); for (int i = 0; i < modelElements.length; ++i) { IModelElement element = modelElements[i]; if (element instanceof ModelElement) { ((ModelElement) element).printNode(output); } else { output.print("Unknown element:" + element); //$NON-NLS-1$ } } } catch (ModelException ex) { output.formatPrint(ex.getLocalizedMessage()); } output.dedent(); } @Override public ISourceRange getNameRange() throws ModelException { return null; } }