blob: 1682944ec7b84af942f919df2f6ccd269cbfc154 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2009, 2021 Stephan Wahlbrink and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
# which is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
#
# Contributors:
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.internal.r.core.sourcemodel;
import static org.eclipse.statet.internal.r.core.sourcemodel.RSourceModel.NO_R_SOURCE_CHILDREN;
import java.util.List;
import java.util.Objects;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;
import org.eclipse.statet.jcommons.text.core.TextRegion;
import org.eclipse.statet.ltk.ast.core.AstNode;
import org.eclipse.statet.ltk.model.core.LtkModelUtils;
import org.eclipse.statet.ltk.model.core.element.LtkModelElementFilter;
import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
import org.eclipse.statet.r.core.model.RElement;
import org.eclipse.statet.r.core.model.RElementName;
import org.eclipse.statet.r.core.model.RFrame;
import org.eclipse.statet.r.core.model.RLangSourceElement;
import org.eclipse.statet.r.core.model.RModel;
import org.eclipse.statet.r.core.model.RSourceUnit;
@NonNullByDefault
public abstract class EmbeddedRBuildElement implements BuildSourceFrameElement {
protected final SourceStructElement<?, ?> parent;
protected final AstNode node;
private final RElementName name;
protected final @Nullable TextRegion nameRegion;
int occurrenceCount;
BuildSourceFrame envir;
List<? extends RLangSourceElement> sourceChildrenProtected= NO_R_SOURCE_CHILDREN;
public EmbeddedRBuildElement(final SourceStructElement<?, ?> parent, final AstNode node,
final RElementName name, final @Nullable TextRegion nameRegion) {
this.parent= parent;
this.node= node;
this.name= name;
this.nameRegion= nameRegion;
}
@Override
public void setSourceChildren(final List<? extends RLangSourceElement> children) {
this.sourceChildrenProtected= children;
}
@Override
public BuildSourceFrame getBuildFrame() {
return this.envir;
}
@Override
public final String getModelTypeId() {
return RModel.R_TYPE_ID;
}
@Override
public RElementName getElementName() {
return this.name;
}
@Override
public final String getId() {
final String name= getElementName().getDisplayName();
final StringBuilder sb= new StringBuilder(name.length() + 10);
sb.append(Integer.toHexString(getElementType() & MASK_C2));
sb.append(':');
sb.append(name);
sb.append('#');
sb.append(this.occurrenceCount);
return sb.toString();
}
@Override
public RSourceUnit getSourceUnit() {
return (RSourceUnit)this.parent.getSourceUnit();
}
@Override
public boolean exists() {
return this.parent.exists();
}
@Override
public boolean isReadOnly() {
return this.parent.isReadOnly();
}
@Override
public @Nullable RElement<?> getModelParent() {
return null;
}
@Override
public boolean hasModelChildren(final @Nullable LtkModelElementFilter<? super RLangSourceElement> filter) {
return false;
}
@Override
public List<? extends RLangSourceElement> getModelChildren(final @Nullable LtkModelElementFilter<? super RLangSourceElement> filter) {
return NO_R_SOURCE_CHILDREN;
}
@Override
public @Nullable SourceStructElement<?, ?> getSourceParent() {
return this.parent;
}
@Override
public boolean hasSourceChildren(final @Nullable LtkModelElementFilter<? super RLangSourceElement> filter) {
return LtkModelUtils.<RLangSourceElement>hasChildren(this.sourceChildrenProtected, filter);
}
@Override
public List<? extends RLangSourceElement> getSourceChildren(final @Nullable LtkModelElementFilter<? super RLangSourceElement> filter) {
return LtkModelUtils.<RLangSourceElement>getChildren(this.sourceChildrenProtected, filter);
}
@Override
public TextRegion getSourceRange() {
return this.node;
}
@Override
public @Nullable TextRegion getNameSourceRange() {
return this.nameRegion;
}
@Override
public @Nullable TextRegion getDocumentationRange() {
return null;
}
@Override
@SuppressWarnings("unchecked")
public <T> @Nullable T getAdapter(final Class<T> adapterType) {
if (adapterType == RFrame.class) {
return (T)this.envir;
}
if (adapterType == AstNode.class) {
return (T)this.node;
}
return null;
}
@Override
public int hashCode() {
return RElement.C2_SOURCE_CHUNK * Objects.hashCode(this.name.getSegmentName()) + this.occurrenceCount;
}
@Override
public boolean equals(final @Nullable Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof EmbeddedRBuildElement) {
final EmbeddedRBuildElement other= (EmbeddedRBuildElement)obj;
return (this.occurrenceCount == other.occurrenceCount
&& this.name.equals(other.name) );
}
return false;
}
}