Bug 577558: [R-Model] Add support for SourceContainerElement

Change-Id: I62facbbe37773cbc835e0bbccd80f8cd85afda86
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/CompositeSourceElement.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/CompositeSourceElement.java
index d15b2fb..5f767e9 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/CompositeSourceElement.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/CompositeSourceElement.java
@@ -24,6 +24,7 @@
 import org.eclipse.statet.jcommons.lang.Nullable;
 import org.eclipse.statet.jcommons.text.core.TextRegion;
 
+import org.eclipse.statet.ltk.core.source.SourceModelStamp;
 import org.eclipse.statet.ltk.model.core.element.LtkModelElementFilter;
 import org.eclipse.statet.r.core.rmodel.RCompositeSourceElement;
 import org.eclipse.statet.r.core.rmodel.RLangSourceElement;
@@ -42,9 +43,11 @@
 	private volatile @Nullable List<RLangSourceElement> allSourceChildren;
 	
 	
-	public CompositeSourceElement(final RSourceUnit su, final BuildSourceFrame envir,
+	public CompositeSourceElement(final RSourceUnit sourceUnit,
+			final SourceModelStamp stamp,
+			final BuildSourceFrame envir,
 			final List<? extends EmbeddedRBuildElement> elements, final TextRegion sourceRange) {
-		super(su, envir);
+		super(sourceUnit, stamp, envir);
 		
 		this.compositeElements= ImCollections.toList(elements);
 		this.sourceRange= sourceRange;
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/RSourceFileElement.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/RSourceFileElement.java
index 10c465d..1960886 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/RSourceFileElement.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/RSourceFileElement.java
@@ -22,8 +22,10 @@
 import org.eclipse.statet.jcommons.text.core.TextRegion;
 
 import org.eclipse.statet.ltk.core.ElementName;
+import org.eclipse.statet.ltk.core.source.SourceModelStamp;
 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.SourceContainerElement;
 import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
 import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
 import org.eclipse.statet.r.core.rmodel.RElement;
@@ -35,16 +37,22 @@
 
 
 @NonNullByDefault
-abstract class RSourceFileElement implements RLangSourceElement {
+abstract class RSourceFileElement implements RLangSourceElement,
+		SourceContainerElement<RLangSourceElement> {
 	
 	
 	private final RSourceUnit sourceUnit;
 	
+	private final SourceModelStamp stamp;
+	
 	protected final BuildSourceFrame envir;
 	
 	
-	public RSourceFileElement(final RSourceUnit su, final BuildSourceFrame envir) {
-		this.sourceUnit= su;
+	public RSourceFileElement(final RSourceUnit sourceUnit,
+			final SourceModelStamp stamp,
+			final BuildSourceFrame envir) {
+		this.sourceUnit= sourceUnit;
+		this.stamp= stamp;
 		this.envir= envir;
 	}
 	
@@ -110,6 +118,11 @@
 		return this.sourceUnit;
 	}
 	
+	@Override
+	public SourceModelStamp getStamp() {
+		return this.stamp;
+	}
+	
 	
 	@Override
 	public @Nullable TextRegion getNameSourceRange() {
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/RSourceUnitElement.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/RSourceUnitElement.java
index c2401e6..c33fa85 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/RSourceUnitElement.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/RSourceUnitElement.java
@@ -21,6 +21,7 @@
 import org.eclipse.statet.jcommons.text.core.TextRegion;
 
 import org.eclipse.statet.ltk.ast.core.AstNode;
+import org.eclipse.statet.ltk.core.source.SourceModelStamp;
 import org.eclipse.statet.ltk.model.core.LtkModelUtils;
 import org.eclipse.statet.ltk.model.core.element.LtkModelElementFilter;
 import org.eclipse.statet.r.core.rmodel.RElementName;
@@ -30,15 +31,18 @@
 
 
 @NonNullByDefault
-final class RSourceUnitElement extends RSourceFileElement implements BuildSourceFrameElement {
+final class RSourceUnitElement extends RSourceFileElement
+		implements BuildSourceFrameElement {
 	
 	
 	private final RAstNode sourceNode;
 	private List<? extends RLangSourceElement> sourceChildrenProtected= RSourceModel.NO_R_SOURCE_CHILDREN;
 	
 	
-	public RSourceUnitElement(final RSourceUnit su, final BuildSourceFrame envir, final RAstNode node) {
-		super(su, envir);
+	public RSourceUnitElement(final RSourceUnit sourceUnit,
+			final SourceModelStamp stamp,
+			final BuildSourceFrame envir, final RAstNode node) {
+		super(sourceUnit, stamp, envir);
 		this.sourceNode= node;
 	}
 	
diff --git a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/SourceAnalyzer.java b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/SourceAnalyzer.java
index c11b267..af2385f 100644
--- a/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/SourceAnalyzer.java
+++ b/r/org.eclipse.statet.r.core/src/org/eclipse/statet/internal/r/core/rmodel/SourceAnalyzer.java
@@ -529,24 +529,26 @@
 	}
 	
 	
-	public @Nullable RSourceUnitModelInfo createModel(final RSourceUnit u, final AstInfo sourceComponent) {
-		if (!(sourceComponent.getRoot() instanceof SourceComponent)) {
+	public @Nullable RSourceUnitModelInfo createModel(final RSourceUnit u, final AstInfo ast) {
+		if (!(ast.getRoot() instanceof SourceComponent)) {
 			throw new IllegalArgumentException("ast"); //$NON-NLS-1$
 		}
-		final SourceComponent root= (SourceComponent)sourceComponent.getRoot();
+		final SourceComponent root= (SourceComponent)ast.getRoot();
 		this.anonymCount= 0;
 		this.sourceUnit= u;
 		
 		try {
 			init();
 			
-			final RSourceUnitElement fileElement= new RSourceUnitElement(this.sourceUnit, this.topLevelEnvir, root);
+			final RSourceUnitElement fileElement= new RSourceUnitElement(
+					this.sourceUnit, ast.getStamp(),
+					this.topLevelEnvir, root );
 			enterElement(fileElement, this.topLevelEnvir, root);
 			root.acceptInRChildren(this);
 			leaveElement();
 			
 			finish();
-			this.ast= new AstInfo(AstInfo.LEVEL_MODEL_DEFAULT, sourceComponent);
+			this.ast= new AstInfo(AstInfo.LEVEL_MODEL_DEFAULT, ast);
 			final RSourceUnitModelInfoImpl modelInfo= new RSourceUnitModelInfoImpl(this.ast, this.frames, this.topLevelEnvir,
 					this.packageRefs, this.dependencyEnvironments, fileElement );
 			
@@ -649,7 +651,8 @@
 		try {
 			finish();
 			
-			final var compositeElement= new CompositeSourceElement(this.sourceUnit,
+			final var compositeElement= new CompositeSourceElement(
+					this.sourceUnit, this.ast.getStamp(),
 					this.topLevelEnvir, chunkElements, this.ast.getRoot() );
 			return new RSourceUnitModelInfoImpl(this.ast, this.frames,
 					this.topLevelEnvir, this.packageRefs, this.dependencyEnvironments,