/*******************************************************************************
* Copyright (c) 2000, 2004 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.erlide.engine.internal.model.erlang;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.erlide.engine.internal.model.SourceRange;
import org.erlide.engine.internal.model.root.ErlElement;
import org.erlide.engine.internal.model.root.Openable;
import org.erlide.engine.model.ErlModelException;
import org.erlide.engine.model.IErlElement;
import org.erlide.engine.model.IParent;
import org.erlide.engine.model.erlang.ISourceRange;
import org.erlide.engine.model.erlang.ISourceReference;
import org.erlide.engine.model.root.IOpenable;
import com.google.common.base.Objects;
/**
* Abstract class for Erlang elements which implement ISourceReference.
*/
public abstract class SourceRefElement extends ErlElement implements ISourceReference {
protected int fSourceRangeOffset;
protected int fSourceRangeLength;
protected int lineStart, lineEnd;
protected SourceRefElement(final IParent parent, final String name) {
super(parent, name);
}
/**
* Returns a new element info for this element.
*/
protected Object createElementInfo() {
return null; // not used for source ref elements
}
/*
* @see ErlElement#generateInfos
*/
protected void open(final IProgressMonitor pm) throws ErlModelException {
final Openable openableParent = (Openable) getOpenableParent();
if (openableParent == null) {
return;
}
openableParent.open(pm);
}
/**
* Elements within compilation units and class files have no corresponding
* resource.
*
* @see IErlElement
*/
@Override
public IResource getCorrespondingResource() {
// if (!exists()) {
// throw newNotPresentException();
// }
return null;
}
/**
* Return the first instance of IOpenable in the hierarchy of this type
* (going up the hierarchy from this type);
*/
@Override
public IOpenable getOpenableParent() {
IParent parent = getParent();
while (parent != null) {
if (parent instanceof IOpenable) {
return (IOpenable) parent;
}
if (parent instanceof IErlElement) {
final IErlElement parentElement = (IErlElement) parent;
parent = parentElement.getParent();
} else {
break;
}
}
return null;
}
/**
* @see ISourceReference
*/
// public String getSource() throws ErlModelException {
// // final IOpenable openable = getOpenableParent();
// // final IBuffer buffer = openable.getBuffer();
// // if (buffer == null) {
// // return null;
// // }
// // final ISourceRange range = getSourceRange();
// // final int offset = range.getOffset();
// // final int length = range.getLength();
// // if (offset == -1 || length == 0) {
// // return null;
// // }
// // try {
// // return buffer.getText(offset, length);
// // } catch (final RuntimeException e) {
// // return null;
// // }
// return "";
// }
/**
* @see ISourceReference
*/
@Override
public ISourceRange getSourceRange() {
return new SourceRange(fSourceRangeOffset, fSourceRangeLength);
}
// /**
// * @see IErlElement
// */
// public IResource getUnderlyingResource() throws ErlModelException {
// if (!exists()) {
// throw newNotPresentException();
// }
// return getParent().getUnderlyingResource();
// }
/**
* @see IParent
*/
@Override
public boolean hasChildren() {
synchronized (getModelLock()) {
return internalGetChildren().size() > 0;
}
}
public void setSourceRangeOffset(final int offset) {
fSourceRangeOffset = offset;
}
public void setSourceRangeLength(final int length) {
fSourceRangeLength = length;
}
public void setLineStart(final int lineStart) {
this.lineStart = lineStart;
}
@Override
public int getLineStart() {
return lineStart;
}
public void setLineEnd(final int lineEnd) {
this.lineEnd = lineEnd;
}
@Override
public int getLineEnd() {
return lineEnd;
}
@Override
public boolean equals(final Object o) {
if (!super.equals(o) || !(o instanceof SourceRefElement)) {
return false;
}
final SourceRefElement r = (SourceRefElement) o;
return fSourceRangeOffset == r.fSourceRangeOffset
&& fSourceRangeLength == r.fSourceRangeLength;
}
@Override
public int hashCode() {
return Objects.hashCode(super.hashCode(), fSourceRangeOffset, fSourceRangeLength);
}
@Override
public String getSource() throws ErlModelException {
throw new UnsupportedOperationException();
}
}