/** * <copyright> * </copyright> * * */ package org.emftext.term.propositional.expression.resource.expression.mopp; /** * ExpressionLayoutInformation objects are used to store layout information that * is found while parsing text files. Layout information does include all unused * tokens. Usually, these are whitespace characters, line breaks and comments, but * depending on the concrete syntax definition it can also include other tokens. * ExpressionLayoutInformations are aggregated in LayoutInformationAdapters. One * ExpressionLayoutInformation contains the layout that was found before a * keyword, attribute or reference. */ public class ExpressionLayoutInformation { /** * The element in the grammar that is associated with this layout information. * This can be either an attribute, a non-containment reference (placeholder) or a * terminal (boolean or enumeration). */ private final org.emftext.term.propositional.expression.resource.expression.grammar.ExpressionSyntaxElement syntaxElement; /** * The offset in the document where this piece of layout was found. */ private final int startOffset; /** * Contains a concatenated version of all hidden tokens that were found before * this object. */ private final String hiddenTokenText; /** * Contains the visible token that represented this object in its text form. */ private final String visibleTokenText; /** * The object the layout information refers to. This can be either the value of an * attribute or a referenced EObject. */ private Object object; /** * A flag that is used to remember whether the proxy to which this layout refers * was resolved. */ private boolean wasResolved; public ExpressionLayoutInformation(org.emftext.term.propositional.expression.resource.expression.grammar.ExpressionSyntaxElement syntaxElement, Object object, int startOffset, String hiddenTokenText, String visibleTokenText) { super(); this.syntaxElement = syntaxElement; this.object = object; this.startOffset = startOffset; this.hiddenTokenText = hiddenTokenText; this.visibleTokenText = visibleTokenText; } public org.emftext.term.propositional.expression.resource.expression.grammar.ExpressionSyntaxElement getSyntaxElement() { return syntaxElement; } public int getStartOffset() { return startOffset; } /** * Returns the objects that this layout information adapter refers to. This can be * either the value of an attribute or a referenced object. If the parameter * 'resolve' is set to true and the referenced object is a proxy, this method * tries to resolve the proxy. */ public Object getObject(org.eclipse.emf.ecore.EObject container, boolean resolve) { if (wasResolved || !resolve) { return object; } // we need to try to resolve proxy objects again, because the proxy might have // been resolved before this adapter existed, which means we missed the // replaceProxy() notification if (object instanceof org.eclipse.emf.ecore.InternalEObject) { org.eclipse.emf.ecore.InternalEObject internalObject = (org.eclipse.emf.ecore.InternalEObject) object; if (internalObject.eIsProxy()) { if (container instanceof org.eclipse.emf.ecore.InternalEObject) { org.eclipse.emf.ecore.InternalEObject internalContainer = (org.eclipse.emf.ecore.InternalEObject) container; org.eclipse.emf.ecore.EObject resolvedObject = internalContainer.eResolveProxy(internalObject); if (resolvedObject != internalObject) { object = resolvedObject; wasResolved = true; } } } } else { wasResolved = true; } return object; } public String getHiddenTokenText() { return hiddenTokenText; } public String getVisibleTokenText() { return visibleTokenText; } public void replaceProxy(org.eclipse.emf.ecore.EObject proxy, org.eclipse.emf.ecore.EObject target) { if (this.object == proxy) { this.object = target; } } public String toString() { return "visible='" + visibleTokenText + "', hidden='" + hiddenTokenText + "', object='" + object + "', syntaxElement='" + syntaxElement + "'"; } }