/******************************************************************************* * Copyright (c) 2010 xored software, Inc. * * 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: * xored software, Inc. - initial API and Implementation (Alex Panchenko) *******************************************************************************/ package org.eclipse.dltk.javascript.typeinfo; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.dltk.annotations.Internal; import org.eclipse.dltk.annotations.NonNull; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.ISourceModule; public abstract class ReferenceSource implements IAdaptable { @Internal static class Unknown extends ReferenceSource { @Override public IModelElement getModelElement() { return null; } @Override public ISourceModule getSourceModule() { return null; } @Override public String toString() { return "UNKNOWN"; } } public static final ReferenceSource UNKNOWN = new Unknown(); private static class ModelElementSource extends ReferenceSource { @NonNull private final IModelElement modelElement; public ModelElementSource(IModelElement modelElement) { this.modelElement = modelElement; } @Override public IModelElement getModelElement() { return modelElement; } @Override public ISourceModule getSourceModule() { return modelElement instanceof ISourceModule ? (ISourceModule) modelElement : null; } @Override public String toString() { return modelElement.getElementName(); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } else if (obj instanceof ModelElementSource) { return modelElement .equals(((ModelElementSource) obj).modelElement); } else { return false; } } } @Internal static class Dummy extends Unknown { @Override public String toString() { return "Dummy"; } } /** * Creates {@link ReferenceSource} for the specified {@link IModelElement} * if not null or creates new dummy result. */ public static ReferenceSource create(IModelElement modelElement) { return modelElement != null ? new ModelElementSource(modelElement) : new Dummy(); } public abstract IModelElement getModelElement(); public abstract ISourceModule getSourceModule(); public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) { if (adapter == ReferenceSource.class) { return this; } else { return null; } } }