blob: d706e212a8a5fef4304aaa9d1a6c01f1af07a147 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2008, 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 java.util.List;
import org.eclipse.statet.jcommons.collections.ImCollections;
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.core.ElementName;
import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
import org.eclipse.statet.ltk.model.core.element.LtkModelElementFilter;
import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
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
abstract class RSourceFileElement implements RLangSourceElement {
private final RSourceUnit sourceUnit;
protected final BuildSourceFrame envir;
public RSourceFileElement(final RSourceUnit su, final BuildSourceFrame envir) {
this.sourceUnit= su;
this.envir= envir;
}
@Override
public final String getModelTypeId() {
return RModel.R_TYPE_ID;
}
@Override
public int getElementType() {
return LtkModelElement.C2_SOURCE_FILE;
}
@Override
public RElementName getElementName() {
final ElementName elementName= this.sourceUnit.getElementName();
if (elementName instanceof RElementName) {
return (RElementName) elementName;
}
return RElementName.create(RElementName.RESOURCE, elementName.getSegmentName());
}
@Override
public String getId() {
return this.sourceUnit.getId();
}
@Override
public boolean exists() {
final SourceUnitModelInfo modelInfo= getSourceUnit().getModelInfo(RModel.R_TYPE_ID, 0, null);
return (modelInfo != null && modelInfo.getSourceElement() == this);
}
@Override
public boolean isReadOnly() {
return this.sourceUnit.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 ImCollections.emptyList();
}
@Override
public @Nullable SourceStructElement<?, ?> getSourceParent() {
return null;
}
@Override
public RSourceUnit getSourceUnit() {
return this.sourceUnit;
}
@Override
public @Nullable TextRegion getNameSourceRange() {
return null;
}
@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;
}
return null;
}
@Override
public int hashCode() {
return this.sourceUnit.hashCode();
}
@Override
public boolean equals(final @Nullable Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof SourceStructElement) {
final SourceStructElement<?, ?> other= (SourceStructElement<?, ?>)obj;
return ((other.getElementType() & LtkModelElement.MASK_C2) == LtkModelElement.C2_SOURCE_FILE)
&& this.sourceUnit.equals(other.getSourceUnit());
}
return false;
}
}